对于类型为shared_ptr的对象,对于创建的单个对象,会多次调用desructor

时间:2017-04-12 18:38:45

标签: c++11 shared-ptr smart-pointers

我只是在c ++ 11中写了一些小代码,我遇到了一种我无法理解输出的情况。 对于下面的代码,构造函数只调用一次,而析构函数被多次调用。如果我用删除p 替换删除[] p ,它的行为是正确的,但为什么删除[] p 会给出这种输出?

#include <iostream>
#include <memory>

class MyClass{
public:
    MyClass(){std::cout<<"Constructor called..."<<std::endl;}
    ~MyClass(){std::cout<<"Destructor called..."<<std::endl;}
    void printMe(){std::cout<<"PrintMe called..."<<std::endl;}
};

int main(){
    std::shared_ptr<MyClass> ptr = std::shared_ptr<MyClass>(new MyClass(),
    [](MyClass *p){std::cout<<"Custom Deleter ..for p"<<std::endl; delete[] p;});
}

1 个答案:

答案 0 :(得分:0)

您的程序有不确定的行为。

您正在使用new MyClass()分配内存,然后使用delete [] p将其删除。

仅使用delete p;

int main(){
    std::shared_ptr<MyClass> ptr = std::shared_ptr<MyClass>(new MyClass(),
    [](MyClass *p){std::cout<<"Custom Deleter ..for p"<<std::endl; delete p;});
}