【问题标题】:free: invalid pointer when deleting a dynamically created arrayfree:删除动态创建的数组时指针无效
【发布时间】:2021-11-05 14:03:27
【问题描述】:

我目前正在练习指针算术,但在使用delete [] arr; 执行最后一行时,我无法弄清楚为什么这段代码会以“free(): invalid pointer”错误结束。

我意识到,在我的 Android 手机上使用 C4Droid 程序(使用编译器“G++ + Bionic”)时,相同的代码运行没有任何问题,但在我使用 GCC 的平板电脑上,它只是不起作用。我发现的唯一方法是确保 arr 数组当前指向第一个地址。它没有的那一刻似乎失败了。我不知道它是否应该在我的手机上也失败,或者它是否是我在平板电脑上使用的 IDE 中的配置问题(尝试使用代码块和 codelite)。你能帮忙吗?

我也很清楚,我正在为数组的前两个点初始化值,而在技术上可以选择比这更小的数组大小。这只是测试。

#include <string>
#include <iostream>

int main()
{
    int *arr{};
    size_t size{};
    std::cout << "Please enter the size of the array you want to create: "; std::cin >> size;
    arr = new int[size];
    *(arr + 0) = 5;
    *(arr + 1) = 10;
    std::cout << "++arr: " << ++arr << " (pointer incrementation, we move by an int and arr is now arr + 1)" << std::endl;  
    delete [] arr;
    return 0;
}

【问题讨论】:

  • “我不知道它是否应该在我的手机上也失败” - 这是未定义的行为。它可以为所欲为,包括崩溃、不崩溃、看似正常工作、格式化硬盘或making demons fly out of your nose。您只能使用new 分配的delete 指针,仅此而已。
  • arr 不是用new 分配的arr,因为您增加了指针。
  • “运行没有任何问题”应该是“运行没有任何问题我可以检测到”。有问题,但是Android下的症状很微妙。

标签: c++ arrays pointers dynamic-memory-allocation delete-operator


【解决方案1】:

在你增加指针arr的这个语句之后

std::cout << "++arr: " << ++arr << " (pointer incrementation, we move by an int and arr is now arr + 1)" << std::endl;  

指针现在没有分配内存的地址。

所以下一条语句

delete [] arr;

调用未定义的行为。

您必须向 operator delete [] 传递一个与 operator new 返回的值(地址)相同的指针。

你可以这样写

delete [] --arr;

使用减量运算符将指针重置为其初始值。

【讨论】:

  • 非常感谢。现在这确实很有意义。这意味着我必须始终确保将原始地址保存在某个地方,以防我进行这样的指针运算,以便可以将指针的值恢复到调用delete [] arr 之前的值。这也是为什么在我将指针“重置”到原始地址后它起作用的原因。很高兴知道!
【解决方案2】:

您没有删除分配的同一个指针 - ++arr 移动了指针。在new type[] 未分配的任何指针上调用delete[] 是未定义的行为 - 它可以工作,它可能会发生灾难性的失败,并且它可以在两者之间做任何事情 - 但你真的应该依赖它。

【讨论】:

  • 谢谢,一切都清楚!我错误地认为delete [] arr 仍然可以工作,因为++arr 指向我动态分配的数组中的下一个地址。我没有意识到仅仅通过更改地址,即使在这种情况下,也会弄乱释放。
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2021-10-07
  • 2021-10-05
  • 1970-01-01
相关资源
最近更新 更多