c++ - 所有 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;
}
解决方案
我做错了什么?还是它的 g++ 错误?
您的程序的行为未定义:
如果被删除对象的静态类型与其动态类型不同(例如通过指向基的指针删除多态对象时),并且如果静态类型中的析构函数是虚拟的,则删除的单对象形式开始查找释放函数的名称从其虚拟析构函数的最终覆盖器的定义点开始。无论在运行时执行哪个释放函数,静态可见版本的 operator delete 都必须可访问才能编译。在其他情况下,当通过指向 base 的指针删除数组时,或者在使用非虚拟析构函数通过指向 base 的指针删除时,行为是 undefined。
推荐阅读
- java - 滚动时如何调用 RecyclerView 项目
- flutter - 如何将文本提交到按钮,当按下按钮时,它将在颤动中使用 bloc 在另一个页面上显示文本
- javascript - 未捕获的类型错误:this._tweens[i].update 不是 Phaser.TweenManager.update 中的函数
- sql-server - 用户 'CHIEF\PRODYCHDBX3$' 登录失败
- java - 从对另一个实体的操作触发对实体的操作Spring数据JPA
- python - 在Python中从共享驱动器读取没有扩展名的文件
- excel - 如果列中的单元格与特定测试匹配,我想更改列值
- matlab - 通过 COM 端口在 MATLAB 中获取十进制数据
- regex - 如果比较两列
- jquery - 如何在邮递员中自动读取 json 或 csv 文件