我只是在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;});
}
答案 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;});
}