C++如何删除默认的指针对象成员
我有一个类型,它的成员是指向另一个对象的指针。创建对象演示时,它初始化构造函数中的其他对象属性。我想,如果我有很多这样的对象,当我将属性更改为其他内容时,我不想浪费堆空间,所以我在setProperty中释放初始化内存,然后在演示的解构中再次删除它,因为到那时它将被设置为其他内容。但是,这会导致代码崩溃。如果重置属性时重新分配属性,为什么会崩溃C++如何删除默认的指针对象成员,c++,oop,delete-operator,C++,Oop,Delete Operator,我有一个类型,它的成员是指向另一个对象的指针。创建对象演示时,它初始化构造函数中的其他对象属性。我想,如果我有很多这样的对象,当我将属性更改为其他内容时,我不想浪费堆空间,所以我在setProperty中释放初始化内存,然后在演示的解构中再次删除它,因为到那时它将被设置为其他内容。但是,这会导致代码崩溃。如果重置属性时重新分配属性,为什么会崩溃 class Property{ }; class Demo{ protected: Property *proper
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创建的对象的地址,然后尝试将其删除。这是未定义的行为 最有可能的速成课程解释是,标准库也释放了属性p。首先释放它,然后在程序结束时再次释放p 可能的修复方法是传递一个允许删除的对象,即由new创建的对象 请注意,有更好更干净的方法来实现您正在尝试做的事情。这个答案正好解释了这次事故
你应该看到,这个设计很难决定你是否应该自由。因此,您的代码取决于参数原点。这应该是设计的一个危险信号。使用标准库提供的适当工具消除所有内存管理问题
#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;
}
财产在哪里申报?此外,您只能使用“删除”来释放使用“新建”创建的内容。main中的p是堆栈分配的,因此Demo::~Demo实际上是在删除堆栈分配的对象,这是一种未定义的行为。除此之外,这个甚至不存在compile属性的事实外,这里还有很多误解,我甚至不知道从哪里开始。首先,你为什么要使用动态分配?你违反了,你试图删除一个没有分配新的对象。我意识到我忘记了受保护的属性*属性;不允许删除不是使用new创建的对象。这就是坠机的原因。
#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;
}