学习C++新特性(四)智能指针与内存管理

本文详细介绍了C++中智能指针shared_ptr、unique_ptr及weak_ptr的使用方法与原理。通过示例展示了如何利用make_shared与make_unique初始化智能指针,并讨论了shared_ptr在循环引用场景下的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shared_ptr

   make_shared<T> 分配创建传入参数的对象,get() 获取原始指针 reset() 减少一个引用计数,use_count()查看引用计数

    auto it = make_shared<int> (19); //声明一个it的对象
    cout << *it<<" "<<it.use_count()<<endl; //19 1 计数内容
    shared_ptr<int> it1 = it;  // it1也指向it的内存地址
	cout << *it<<" "<<it1.use_count()<<" "<<it.use_count()<<endl; //19 2 2
	int* i2 = it.get();//get函数获取原始对象的指针
	cout << *i2<<endl; //19 
	it.reset(); // 将it的引用计数减少1 it也不能使用了
	cout << *it1<<" "<<it1.use_count()<<endl; //19 1

 unique_ptr C++14实现的

独占指针,禁止复制,可用move()进行转移给其他unique_ptr

make_unique 自己实现

template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args ) {
  return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}

weak_ptr 解决资源未释放 没有* ->运算符,只能检查shared_ptr是否存在  expired()函数当资源未释放时返回false。

使用shared_ptr的反例

struct A;
struct B;

struct A {
    std::shared_ptr<B> pointer;
    ~A() {
        std::cout << "A 被销毁" << std::endl;
    }
};
struct B {
    std::shared_ptr<A> pointer;
    ~B() {
        std::cout << "B 被销毁" << std::endl;
    }
};
int main() {
    auto a = std::make_shared<A>(); 
    auto b = std::make_shared<B>();
    a->pointer = b;
    b->pointer = a;
   
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值