创建一个类
class connection{
private:
string ip;
public:
connection() {ip='0.0.0.0';}
connection(const string &s):ip(s) {}
void show() {cout << ip << endl;}
~connection() {cout << ip << " now shut down." << endl;}
};
然后在main函数中有这样的代码
int main() {
connection c("192.168.1.32");
{
shared_ptr<connection> sp(&c);
sp->show();
}
c.show();
cout << "now shared_ptr end." << endl;
return 0;
}
这样的情况会导致重复释放一个对象两次。因为在智能指针被释放时,会自动调用对象的析构函数。在main结束后,又再次调用了c的析构函数,很明显这样是不合理的。会出现严重的后果,double free or corruption (out)
所以,如果需要智能指针代为管理对象,应该将代码改成
int main() {
auto sp = make_shared<connection>("1.1.1.1");
sp->show();
cout << "now shared_ptr end." << endl;
return 0;
}
这样用make_shared<>()函数创建一个shared_ptr指向自己的对象。该函数在头文件memory中
不要将已经存在的对象交给智能指针保管!