所以在代码审查期间,我的一位同事使用了double * d = new double [foo];然后调用删除d.我告诉他们应该改变它以删除[] d.他们表示编译器不需要基本数据类型.我不同意.
所以我想我会通过实验证明我的观点:
#define NUM_VALUES 10000
int main(int argc,char** argv)
{
int i = 0;
while (true)
{
std::cout << i << "|";
double* d = new double[NUM_VALUES];
std::cout << ((void*)d) << std::endl;
for (int j = 0; j < NUM_VALUES; j++)
d[j] = j;
delete d;
i++;
}
return 0;
}
不仅内存使用量不增长,而且每次都将d分配到同一个地方! (Visual Studio 2010).这是visual studio编译器的怪癖吗?或者这是标准的一部分?
解决方法
如果您使用new,则需要使用delete
如果你使用new []你必须使用delete []
他们的意思不同. double * d = new double();意味着分配和构造一个double类型.删除d;表示未分配并破坏单个双重类型. double * d = new double [NUM_VALUES];表示分配NUM_VALUES个双精度数并删除[] d表示未分配的每个NUM_VALUES双精度分配.