文章目录
- 0x1 基本使用
- 0x11 get() [ 参照auto_ptr ]
- 0x12 release() [ 参照auto_ptr ]
- 0x13 reset() [ 参照auto_ptr ]
- 0x14 get_deleter() [ 新增 ]
- 0x15 operator bool [ 新增 ]
- 0x16 swap() [ 新增 ]
- 0x2 make_unique函数 [unique_ptr在C++11引入,make_unique在C++14引入]
- 0x3 解决auto_ptr的迷惑问题
- 0x4 解决auto_ptr的被放弃原因
- 0x5 unique_ptr 仅仅可以解决独占资源所有权,不能解决共享资源的所有权,所以引入shared_ptr
0x1 基本使用
0x11 get() [ 参照auto_ptr ]
0x12 release() [ 参照auto_ptr ]
0x13 reset() [ 参照auto_ptr ]
0x14 get_deleter() [ 新增 ]
0x15 operator bool [ 新增 ]
可以通过nullptr判断,auto_ptr部支持
unique_ptr<string> p1(new string("HelloWorld"));
p1.release();
if (p1 == nullptr) {
cout << "p1 is nullptr" << endl;
}
0x16 swap() [ 新增 ]
unique_ptr<string> p1(new string("HelloWorld"));
unique_ptr<string> p2(new string("VsCode"));
cout << *p1 << endl;
cout << *p2 << endl;
swap(p1, p2);
cout << *p1 << endl;
cout << *p2 << endl;
0x2 make_unique函数 [unique_ptr在C++11引入,make_unique在C++14引入]
make_unique是C++14引入的一个函数模板,用于创建并返回一个指向动态分配对象的unique_ptr智能指针。
它是为了简化代码,避免手动使用new和delete,以及确保资源的正确释放而设计的。
0x21 创建动态分配的整数对象
std::unique_ptr ptr = std::make_unique(42);
std::cout << "Value: " << *ptr << std::endl;
0x22 创建动态分配的自定义类型对象
struct Point {
int x;
int y;
Point(int x, int y) : x(x), y(y) {}
};
int main() {
std::unique_ptr<Point> ptr = std::make_unique<Point>(10, 20);
std::cout << "Point: (" << ptr->x << ", " << ptr->y << ")" << std::endl;
return 0;
}
0x23 创建动态分配的数组对象
std::size_t size = 5;
std::unique_ptr<int[]> ptr = std::make_unique<int[]>(size);
// 赋值
for (std::size_t i = 0; i < size; ++i) {
ptr[i] = i + 1;
}
// 打印
for (std::size_t i = 0; i < size; ++i) {
std::cout << ptr[i] << ends;
}
0x3 解决auto_ptr的迷惑问题
0x31 解决auto_ptr迷惑点1 [unique_ptr禁止拷贝构造]
unique_ptr<string> p1(new string("HelloWorld"));
// unique_ptr禁止拷贝构造
// error: use of deleted function
unique_ptr<string> p2(p1);
// unique_ptr使用move显示剪切操作
unique_ptr<string> p2(move(p1));
0x32 解决auto_ptr迷惑点2 [unique_ptr禁止拷贝赋值]
unique_ptr<string> p1(new string("HelloWorld"));
// unique_ptr禁止拷贝赋值
unique_ptr<string> p3;
// error: use of deleted function
p3 = p1;
// unique_ptr使用move显示剪切操作
p3 = move(p1);
// 被剪切后的p1,不能再次被使用
0x4 解决auto_ptr的被放弃原因
0x41 解决原因1(拷贝行为结果不可控)
unique_ptr<int> foo_test(unique_ptr<int> uptr)
{
cout << *uptr << endl;
*uptr = 100;
cout << *uptr << endl;
return uptr;
}
{
unique_ptr<int> p1 = unique_ptr<int>(new int(3));
cout << *p1 << endl;
// copy赋值后,p2会会被释放掉
// 此处使用move操作
p1 = foo_test(move(p1));
cout << *p1 << endl;
}
0x42 解决原因2 (不支持数组)
参考 0x23 创建动态分配的数组对象
0x43 解决原因3 (STL容器不兼容)
vector<unique_ptr<int>> Ary;
unique_ptr<int> p(new int(3));
// Ary.push_back(p);
Ary.push_back(move(p));
0x5 unique_ptr 仅仅可以解决独占资源所有权,不能解决共享资源的所有权,所以引入shared_ptr
unique_ptr是一种独占所有权的智能指针,它拥有对象的唯一所有权,并且不能被复制。
这意味着在同一时间内只能有一个unique_ptr指向给定的资源。
当unique_ptr离开作用域时,它所管理的资源会被自动释放,这种设计保证了资源的唯一性和确定性释放。
由于unique_ptr只能由一个对象拥有所有权,因此其内存管理方式更加安全。
shared_ptr则允许多个智能指针共享同一个资源的所有权。它通过引用计数来追踪有多少个shared_ptr指向同一资源。
当最后一个指向该资源的shared_ptr销毁时,资源被释放。
这使得shared_ptr非常适合于复杂数据结构的共享和跨组件传递。
然而,使用shared_ptr时需要注意循环引用导致的内存泄漏问题,以及如何避免这些问题