Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++如何删除默认的指针对象成员_C++_Oop_Delete Operator - Fatal编程技术网

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

C++如何删除默认的指针对象成员,c++,oop,delete-operator,C++,Oop,Delete Operator,我有一个类型,它的成员是指向另一个对象的指针。创建对象演示时,它初始化构造函数中的其他对象属性。我想,如果我有很多这样的对象,当我将属性更改为其他内容时,我不想浪费堆空间,所以我在setProperty中释放初始化内存,然后在演示的解构中再次删除它,因为到那时它将被设置为其他内容。但是,这会导致代码崩溃。如果重置属性时重新分配属性,为什么会崩溃 class Property{ }; class Demo{ protected: Property *proper

我有一个类型,它的成员是指向另一个对象的指针。创建对象演示时,它初始化构造函数中的其他对象属性。我想,如果我有很多这样的对象,当我将属性更改为其他内容时,我不想浪费堆空间,所以我在setProperty中释放初始化内存,然后在演示的解构中再次删除它,因为到那时它将被设置为其他内容。但是,这会导致代码崩溃。如果重置属性时重新分配属性,为什么会崩溃

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;
}