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



我只是用 c++11 编写了一些小代码,遇到了无法理解输出的情况。对于下面的代码,构造函数只调用一次,而析构函数被调用很多次。如果我将 delete[] p 替换为删除 p,它的行为正确,但为什么 delete[] 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;});
}

程序具有未定义的行为。

您正在使用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;});
}

相关内容

  • 没有找到相关文章

最新更新