C 如何删除指针的默认对象成员
C++ How to delete a default object member which is a pointer
我有一种类型,该类型作为成员的指针指向另一个对象。创建对象(演示(时,它将在构造函数中初始化其他对象(属性(。我认为如果我有很多这些对象,当我将属性更改为不同的事物时,我不想浪费堆空间,因此我在setProperty
中释放了初始化的内存,然后在演示的deconstrucor中,我会再次删除它,因为它将到那时已设置为不同的东西。但是,这会导致代码崩溃。如果我重置property
,为什么会崩溃?
class Property{ };
class Demo{
protected:
Property *property;
public:
Demo(){ property = new Property();};
void setProperty(Property *p){
delete property;
property = p;
};
~Demo(){
delete property;
};
};
int main(){
Property p = Property();
Demo * d = new Demo();
d->setProperty(&p);
delete d;
}
您传递了new
未创建的对象的地址,然后尝试使用delete
。这是不确定的行为。
最可能的速成课程外观是标准库也释放了Property p
。您首先释放它,然后在程序的末尾再次释放p
。
可能的"修复"是通过允许删除的对象,即由new
。
int main(){
Property *p = new Property();
Demo * d = new Demo();
d->setProperty(p); // Demo is responsible for freeing `p`.
delete d;
} // standard libraries do clean up objects from `main` here
请注意,实施您要做的事情的方法更好,更清洁。这个答案只是解释了崩溃。
您应该看到这一点,这很难选择您是否应该自由。因此,您的代码取决于参数来源。那应该是设计的红色范围。
使用标准库提供的适当工具消除所有内存管理困境。
#include <memory>
class Property{ };
class Demo{
protected:
std::unique_ptr<Property> property;
public:
Demo()
: property { new Property() }
{ }
void setProperty(std::unique_ptr<Property> p){
property = std::move(p);
};
// un-necessary
// ~Demo(){
// delete property;
// };
};
int main(){
auto p = std::unique_ptr<Property>(new Property); // or in c++14: = std::make_unique<Property>();
auto d = std::unique_ptr<Demo>(new Demo); // or in c++14: = std::make_unique<Demo>();
d->setProperty(std::move(p));
// no longer necessary
// delete d;
}
相关文章:
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 为什么指针对象没有调用默认构造函数
- 默认参数和函数指针作为函数参数C++
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- char指针或char变量的默认值是多少
- 在一行中将默认类型值上的指针作为参数传递
- 如何使用带有非默认构造函数的指针来提升序列化
- 指针参数的默认值
- 不能将指针用作默认模板参数
- 模板默认参数作为指向自身的指针
- 指针的默认值
- 原始指针的默认删除器(unique_ptr)
- 常量指针到成员是否默认指向 int?
- 从指针访问值或获取其默认值(如果为 null)的最干净方法
- C 如何删除指针的默认对象成员
- 唯一指针作为默认参数
- 在Qt中,指针默认不与NULL关联
- 调试断言失败(无效空指针)默认字符串参数
- 从动态分配的解引用指针默认初始化非const引用函数参数是否会造成内存泄漏?