C++:智能指针 [unique_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时需要注意循环引用导致的内存泄漏问题,‌以及如何避免这些问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值