Ank*_*rma 21 c++ memory arrays memory-management new-operator
假设我有以下代码段.
int main()
{
int num;
int* cost;
while(cin >> num)
{
int sum = 0;
if (num == 0)
break;
// Dynamically allocate the array and set to all zeros
cost = new int [num];
memset(cost, 0, num);
for (int i = 0; i < num; i++)
{
cin >> cost[i];
sum += cost[i];
}
cout << sum/num;
}
` `delete[] cost;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然我可以delete在while循环中为我的代码移动语句,但为了理解目的,我想知道代码在编写时会发生什么.每次使用运算符时C++都会分配不同的内存空间new吗?
运算符delete只删除最后分配的cost数组吗?
我强烈建议你不要在C++程序中使用"C idioms" .让std图书馆为你工作:这就是为什么它在那里.如果你想要"一个n个整数的数组(向量)"那么那就是std::vector它的全部内容,并且它"随附了电池". 您不必使用诸如"设置最大大小"或"将其设置为零"之类的东西.你只需使用"这件事",你的内部工作你不必[关心......]关心,知道它已经经过彻底的设计和测试.
此外,当您这样做时,您正在使用C++现有的内存管理框架.特别是,你在自己的应用程序中没有做任何"带外"的事情"标准库不知道,哪些可能(!!)它."
C++为您提供了一个非常全面的快速,高效,强大,经过良好测试的功能库. 利用它.
cost您的代码中没有数组.在你的代码中cost是一个指针,而不是一个数组.
代码中的实际数组是通过重复new int [num]调用创建的.每次调用new都会创建一个新的,独立的,无名的数组对象,它位于动态内存中的某个位置.新数组一旦创建new[],就可以通过cost指针访问.由于数组是无名的,因此该cost指针是唯一可以导致创建的无名数组的链接new[].您没有其他方法可以访问该无名数组.
每次cost = new int [num]在循环中执行此操作时,您将创建一个全新的,不同的数组,从而断开cost与前一个数组的链接并cost指向新的数组.
由于cost您是旧数组的唯一链接,因此旧数组无法访问.永远丢失对旧阵列的访问权限.它变成了内存泄漏.
正如你自己正确地说明的那样,你的delete[]表达式只释放最后一个数组 - cost最终指向最后一个数组.当然,只有在您的代码执行该cost = new int [num]行时才会出现这种情况.请注意,您的周期可能会在不进行单个分配的情况下终止,在这种情况下,您将应用于delete[]未初始化(垃圾)指针.