通过指向其基的指针删除 POD 对象是否安全
Is it safe to delete a POD object by a pointer to its base?
实际上,我正在考虑琐碎的可破坏对象,而不仅仅是POD(我不确定POD是否可以具有基类)。
当我从 cpppreferences 中阅读此解释以获取is_trivially_destructible时,我注意到了这一点:
由普通可破坏对象占用的存储可以在不调用析构函数的情况下重复使用。
因此,这样做是安全的:
struct A {
int a;
};
struct B : A {
int b;
};
int main() {
A* a = new B;
delete a;
}
B::~B()
不会被调用 - AFAIK(如果我错了,请纠正)整个内存将被释放。B::~B()
肯定是微不足道的。
闻起来很臭,但我的问题只是关于这段代码的安全性......
不,这是不允许的。[expr.delete]/p3,强调我的:
在第一个备选方案(删除对象)中,如果静态类型 要删除的对象不同于其动态类型,即静态 类型应是要成为的对象的动态类型的基类 已删除,静态类型应具有虚拟析构函数或 行为未定义。
事实上,委员会最近拒绝了一项提案,即通过明确定义的指针到基地删除 POD。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 为什么具有已删除复制构造函数的结构不是 POD 类型
- STD :: vector在清除或删除POD方面的行为会有所不同
- 通过指向其基的指针删除 POD 对象是否安全