如果我在C++中删除一次数组,但多次分配它会怎么样?

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数组吗?

Mik*_*our 22

每次使用运算符时C++都会分配不同的内存空间new吗?

是.

运算符delete只删除最后分配的cost数组吗?

是.

你已经失去了指向其他人的唯一指针,因此他们不可避免地被泄露了.要避免此问题,请不要兼顾指针,而是使用RAII自动管理动态资源.std::vector在这里是完美的(如果你真的需要一个数组;你的例子可以继续阅读并重新使用一个int).

  • @doron:如果你小心它正确地删除数组,这是一个选项,虽然比"vector"更奇怪. (2认同)
  • @sfdcfox只是因为某些东西更加万无一失并不一定意味着它更好 (2认同)

Mik*_*son 7

强烈建议你不要在C++程序中使用"C idioms" .让std图书馆你工作:这就是为什么它在那里.如果你想要"一个n个整数的数组(向量)"那么那就是std::vector它的全部内容,并且它"随附了电池". 不必使用诸如"设置最大大小"或"将其设置为零"之类的东西.你只需使用"这件事",你的内部工作你不必[关心......]关心,知道它已经经过彻底的设计和测试.

此外,当您这样做时,您正在使用C++现有的内存管理框架.特别是,你在自己的应用程序中没有做任何"带外"的事情"标准库不知道,哪些可能(!!)它."

C++为您提供了一个非常全面的快速,高效,强大,经过良好测试的功能库. 利用它.


AnT*_*AnT 5

cost您的代码中没有数组.在你的代码中cost是一个指针,而不是一个数组.

代码中的实际数组是通过重复new int [num]调用创建的.每次调用new都会创建一个新的,独立的,无名的数组对象,它位于动态内存中的某个位置.新数组一旦创建new[],就可以通过cost指针访问.由于数组是无名的,因此该cost指针是唯一可以导致创建的无名数组的链接new[].您没有其他方法可以访问该无名数组.

每次cost = new int [num]在循环中执行此操作时,您将创建一个全新的,不同的数组,从而断开cost与前一个数组的链接并cost指向新的数组.

由于cost您是旧数组的唯一链接,因此旧数组无法访问.永远丢失对旧阵列的访问权限.它变成了内存泄漏.

正如你自己正确地说明的那样,你的delete[]表达式只释放最后一个数组 - cost最终指向最后一个数组.当然,只有在您的代码执行该cost = new int [num]行时才会出现这种情况.请注意,您的周期可能会在不进行单个分配的情况下终止,在这种情况下,您将应用于delete[]未初始化(垃圾)指针.