C++智能指针

std::shared_ptr

std::shared_ptr共享智能指针,可以支持多个智能指针共享一个对象实例。shared_ptr持有的实例会在下面场景下被销毁:

  • 持有实例的最后一个shared_ptr被销毁;
  • 持有实例的最后一个shared_ptr被另一个智能指针赋值,或者shared_ptr调用了reset();

shared_ptr

使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
shared_ptr<User> sp1 = make_shared<User>(1, "sp1", "123456");
shared_ptr<User> sp2(new User(2, "sp2", "123456"));

//指针和赋值动作可以分开
shared_ptr<User> sp3(nullptr);
sp3 = make_shared<User>(3, "sp3", "123456");

// Control Block的ref将会加一
audo p4 = sp1;

//Control Block和Object都会被交换
sp1.swap(sp2);

参考:创建和使用 shared_ptr 实例

注意:不要使用裸指针来初始化智能指针,会导致多次释放内存造成崩溃:

1
2
3
4
5
void test() {
User* user = new User(0, "Jone", "12345");
shared_ptr<User> p1(user);
shared_ptr<User> p2(user);
}

当test()函数退出时,p2会先调用User析构,然后p1会再次调用User析构函数,同时两次释放同一块内存,就会导致程序出错。下面是正确的写法:

1
2
3
4
void test() {
shared_ptr<User> p1(new User(0, "Jone", "12345"));
shared_ptr<User> p2 = p1;
}