首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我在C++中删除一个数组一次,但将它分配了多次,该怎么办?

如果我在C++中删除一个数组一次,但将它分配了多次,该怎么办?
EN

Stack Overflow用户
提问于 2015-05-20 14:11:26
回答 6查看 1.6K关注 0票数 20

假设我有以下片段。

代码语言:javascript
运行
复制
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;
}

虽然我可以将delete语句移动到while循环中,但为了理解起见,我想知道编写代码时会发生什么。每次使用运算符new时,new是否分配不同的内存空间?

操作符delete是否只删除最后分配的cost数组?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-05-20 14:13:52

每次使用运算符new时,C++是否分配不同的内存空间?

是。

操作符delete是否只删除最后分配的cost数组?

是。

你失去了给其他人的唯一指示,所以它们被不可挽回地泄露了。为了避免这个问题,不要篡改指针,而是使用RAII自动管理动态资源。在这里,std::vector将是完美的(如果您确实需要一个数组;您的示例可以继续读取和重用单个int)。

票数 22
EN

Stack Overflow用户

发布于 2015-05-20 14:50:08

我强烈建议您不要在C++程序中使用"C成语“。让std库为您工作:这就是它存在的原因。如果你想要“n个整数的数组(向量)”,那么这就是std::vector的全部内容,它“包括电池”。你不需要在“设置最大尺寸”或“将其设置为零”之类的事情上胡作非为。你只是和“这件事”一起工作,它的内在运作你不需要.关心,知道它已经被彻底设计和测试。

此外,当您这样做时,您是在C++现有的内存管理框架内工作,特别是在您自己的应用程序中,您没有做任何标准库所不知道的“带外”的操作,并且可能会(!!)使用它。

C++为您提供了一个非常全面的库,它包含快速、高效、健壮、测试良好的功能。利用它。

票数 6
EN

Stack Overflow用户

发布于 2015-05-20 14:23:57

代码中没有cost数组。在您的代码中,cost是指针,而不是数组。

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

每次在循环中执行cost = new int [num]时,您都要创建一个全新的、不同的数组,断开从cost到前一个数组的链接,并使cost指向新的数组。

由于cost是您与旧数组的唯一链接,因此该旧数组将变得不可访问。对旧数组的访问将永远丢失。它变成了一个内存泄漏。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30352206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档