【问题标题】:Delete element of array type pointer cause error?删除数组类型指针的元素导致错误?
【发布时间】:2020-03-24 23:53:35
【问题描述】:

我有一个例子:

int* arr = new int[1];
//First Time
arr[0] = 5;
cout << &arr[0] << " " << arr[0] << endl;
delete &arr[0];
cout << &arr[0] << " " << arr[0] << endl;

//Second time
arr[0] = 5;
cout << &arr[0] << " " << arr[0] << endl;
delete &arr[0]; //Error from here
cout << &arr[0] << " " << arr[0] << endl;

上面代码的结果:

00529EF0 5
00529EF0 -572662307
00529EF0 5
//Where the code stop

我不知道为什么它会导致我出现错误?它不允许我第二次删除arr[0],即使第一次成功删除并且我为它分配了一个新值。

【问题讨论】:

  • 仅仅因为它看起来像第一个delete 有效,并不意味着它有效。你想完成什么?
  • delete 某事,然后继续进行,就好像那件事仍然有效一样。事情爆炸的基本配方。我认为由你来解释为什么你认为这应该有效。 (忘记第二次删除;为什么delete &amp;X; 后跟X = 5; 形式的东西会起作用?)

标签: c++ memory memory-management


【解决方案1】:

如果使用new[] 动态分配数组,则必须使用delete[] 将其删除,这将释放整个数组。您不能释放单个元素。您的代码具有未定义的行为,因为您使用了delete 而不是delete[],所以任何事情都可能发生。仅仅因为它看起来有效并不意味着它是正确的。

【讨论】:

【解决方案2】:

未定义行为

&amp;arr[0]arr 衰减 到的内存地址相同。所以你真的打电话给delete arr;。这是未定义的行为,因为当您需要使用 delete[] 时,您正在使用 delete。用new 分配的内存必须delete 释放。用new[] 分配的内存必须delete[] 释放。

但是,让假设您的编译器的运行时在已分配数组的元数据中有足够的信息来正确释放数组。 delete'ing 一个数组释放整个数组。您不能释放数组的单个元素。在释放整个数组后访问数组的任何元素是未定义的行为。在调用 delete arr; 以释放数组后,您正在访问 arr[0]。您没有为 arr 分配一个新数组来指向。你很幸运,你的代码没有直接崩溃。

这是未定义行为的定义 - 任何事情都可能发生。您可能会在旧内存被覆盖之前读取它。您可以从随机存储器中读取。你可能会破坏内存。你可能会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多