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

C++ 如果我在C+;中删除一次数组会怎么样+;,但是要分配多次吗?,c++,arrays,memory,memory-management,new-operator,C++,Arrays,Memory,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]; me

假设我有以下代码片段

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;
}
intmain()
{
int-num;
整数*成本;
while(cin>>num)
{
整数和=0;
如果(num==0)
打破
//动态分配数组并设置为全零
成本=新整数[num];
memset(成本,0,num);
for(int i=0;i>成本[i];
总和+=成本[i];
}

cout每次为数组分配新内存时,以前分配的内存都会泄漏。根据经验,您需要释放内存的次数与分配的次数相同。

是。因此,除了最后一次,循环的每次迭代都会出现内存泄漏

当您使用
new
时,您会分配一个新的内存块。将
new
的结果分配给指针只会更改此指针指向的内容。它不会自动释放此指针以前引用的内存(如果有)

< > C++在每次使用运算符<代码>新< /COD>?< /P>时分配不同的内存空间 对

操作员是否只删除最后分配的
成本
数组


您已经丢失了指向其他指针的唯一指针,因此它们将不可避免地泄漏。为了避免此问题,请不要篡改指针,而是使用来自动管理动态资源。
std::vector
在这里非常完美(如果您真的需要数组;您的示例可以继续读取并重新使用单个
int
).

首先,这一行是错误的:

memset(cost, 0, num);
它假设一个int只有一个字符长。更典型的是,它是四个字符。如果要使用memset初始化数组,应该使用类似的方法:

memset(cost, 0, num*sizeof(*cost));
或者更好地转储memset,并在分配内存时使用它:

cost = new int[num]();

正如其他人指出的那样,delete的位置不正确,将泄漏其相应new分配的除最后一个之外的所有内存。将其移动到循环中。

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

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

在你的周期中,每次你这样做时,你都在创建一个全新的、不同的数组,断开从
cost
到上一个数组的链接,使
cost
指向新的数组

由于
cost
是您指向旧阵列的唯一链接,因此该旧阵列将无法访问。对该旧阵列的访问将永远丢失。这将导致内存泄漏

正如您自己正确地指出的,您的
delete[]
表达式仅释放最后一个数组-最后指向的
cost
数组。当然,只有当您的代码执行
cost=new int[num]时,这才是正确的注意,你的循环可能在不做一次分配的情况下终止,在这种情况下,你将应用<代码>删除[]/CoC>到未初始化的(垃圾)指针。

< P>我强烈建议你不要在C++程序中使用“C习语”。让<代码> STD < /C>库为你工作:这就是为什么它存在。如果你想要“一个数组(向量))对于n个整数,“这就是std::vector
的全部内容,它“包括电池”。你不必胡闹“设置最大大小”或“将其设置为零”。你只需处理“this thing”,它的内部工作你不必…]关心,知道它已经被彻底设计和测试

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


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

@doron:如果您小心地正确删除阵列,这是一个选项,尽管比
vector
更奇怪。使用类似
unique\ptr cost;
[]
表示数组。这正是为什么较新的语言只使用引用而不使用指针的原因。当事物服从RAII…或有一个实际的GC进程清除内存中未引用的对象时,泄漏内存要困难得多。@sfdcfox更简单并不一定意味着它是better@sfdcfox例如:那个例子是doesn不使用RAII,所以它当然会泄漏。使用RAII,这将是
std::string a(5);a=std::string(10)“代码”>字符串类使用RAII自动释放内存,因此没有泄漏。答案是说,你应该使用RAII,而不是手动指针杂耍来避免泄漏。GC是RAII的替代品,但在标准C++中是不可用的,所以我不知道你为什么继续这样做。在答案中,您遇到了另一个比内存泄漏更严重的错误:如果您的
while
执行0次,那么您将有一个
delete[]
而没有任何相应的
new[]
,因此是一个未初始化的指针。这是未定义的行为,可能会导致程序崩溃。(好吧,也许在程序末尾的一条指令之外发生的情况不太引人注目,但这不是一个很好的景象。)你不能多次分配一个数组