C 如何删除指针的默认对象成员

C++ How to delete a default object member which is a pointer

本文关键字:指针 默认 对象 成员 删除 何删除      更新时间:2023-10-16

我有一种类型,该类型作为成员的指针指向另一个对象。创建对象(演示(时,它将在构造函数中初始化其他对象(属性(。我认为如果我有很多这些对象,当我将属性更改为不同的事物时,我不想浪费堆空间,因此我在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;
}