C 适当的新用法

C++ proper new usage?

本文关键字:用法 新用法      更新时间:2023-10-16
int* array = new int[ 10 ]( );

这是新操作员的适当用法吗?据我所知,先前的代码将在数组中初始化为0。

int* array = new int[ 10 ];

第二行代码只是初始化数组,但不将值设置为零?

使用新操作员的正确方法取决于您在分配内存后接下来要做的任何事情。

int* array = new int[10](); 将归零您正在分配的内存,因为它正在为数组中的每个int运行int Initializer。

int* array = new int[10]; 不会初始化内存,因此数组中每个int的值将是您从new获得的内存地址的值。如果您幸运的话,可能是零可能是零,但是很可能是其他一些内存请求/发行中留在那儿的垃圾。

一般而言,您需要将非专业化变量视为垃圾值,而在分配值之前不要使用它们。除非您将其用作随机数生成器中的熵,否则,即使那样,如果内存恰好太干净,它也可能不够随机。另一个罕见的用例可能是在关闭后的另一个程序留在内存中留下的内容。这两个示例都是规则的例外。

通常不初始化的最佳理由是速度。将数组中的每个项目设置为0的速度成本,尽管它可能很小,但如果您的数组很大,或者您经常执行此代码,则可能很明显。这是针对,当您知道在使用这些值之前将设置这些值时,您可以节省不必要的初始化它们的成本。

现在已经说过这一切,我也同意std::vector<int>通常是更好的方法的评论,如果您不必担心内存泄漏的优势,那么这无非调试/开发时间,不应被低估),您还会获得很多好处。更不用说您可以使用可以使用常规数组的向量来完成所有相同的操作 - 这是因为向量分配了连续的内存。

std::vector<int> safeArray(10);
int* array = &safeArray[0]; // array now points to the 0th element in safeArray

用std :: vector丢失的一件事是,您不再选择是否初始化。