C适当的新用法?

int* array = new int[ 10 ]( );

这是新操作符的正确用法吗?据我所知,前面的代码会将数组中的每个元素初始化为0.

int* array = new int[ 10 ];

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

最佳答案 使用new运算符的正确方法取决于分配内存后要做的下一步操作.

int * array = new int [10]();将为您分配的内存清零,因为它正在为数组中的每个int运行int初始值设定项.

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失去的一件事是你不再可以选择是否初始化.

点赞