首页 > 解决方案 > 所有 g++ 版本的 delete[] 可能存在错误或未定义此行为?

问题描述

我有这段代码,它给了我 3 个或更多元素的分段错误。我在 vs 和 clang 上进行了测试,并且可以正常工作(循环结束和二进制结束,没有错误)。我做错了什么?还是它的 g++ 错误?

如果我将delete[]行更改为delete[] static_cast<B*>(a);它也适用于 g++。但是,在实际情况下,我不知道真正的类型,所以我不能转换为任何东西。

class A {
public:
  virtual ~A() {}
  virtual int x() = 0;
};

class B : public A {
public:
  B() : _x(1) {}
  virtual ~B() {}
  virtual int x() { return _x; }
private:
  int _x;
};

int main(int argc, char * argv[]) {
  A * a;
  for (unsigned int i = 1; i <= 10; ++i) {
    a = new B[i];
    delete[] a;
  }
return 0;
}

标签: c++gccdelete-operator

解决方案


我做错了什么?还是它的 g++ 错误?

您的程序的行为未定义

如果被删除对象的静态类型与其动态类型不同(例如通过指向基的指针删除多态对象时),并且如果静态类型中的析构函数是虚拟的,则删除的单对象形式开始查找释放函数的名称从其虚拟析构函数的最终覆盖器的定义点开始。无论在运行时执行哪个释放函数,静态可见版本的 operator delete 都必须可访问才能编译。在其他情况下,当通过指向 base 的指针删除数组时,或者在使用非虚拟析构函数通过指向 base 的指针删除时,行为是 undefined


推荐阅读