我只是用 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;});
}