C++ 智能指针与陷阱

本文探讨了C++智能指针(如std::shared_ptr)的潜在问题,包括重複删除、无法共享*this指针以及可能导致内存泄漏的情况。文章提醒开发者避免外部传入指针给智能指针,理解控制块的工作原理,并建议在使用智能指针时遵循一定的最佳实践,以避免内存管理和引用计数错误。
摘要由CSDN通过智能技术生成

爲什麽要使用智能指針?

C++ 11 带来了几个比较重要且实用的新特性,smart pointers 就是其中一员。auto_ptr 被摒弃,取而代之的是 unique_ptr 。不过它们两个都不是本文关注的对象,而是 shared_ptrweak_ptr 。使用智能指针的目的很纯粹,因为 C++ 没有 GC (Grabage Collector) 。所以我们需要一种 自动释放 资源 (包括但不限于用户空间的内存) 的机制,这个机制就是我们都熟悉的 RAII (Resource Acquisition is Initialization) 。顾名思义,RAII 的原理是对象初始化之期即资源获取之时。同样地,对象破坏之日乃资源归还之时。

NOTE:本文并不是智能指针的入门介绍,默认读者已经对智能指针有一定的认识。


智能指針的致命弱點

1. 重複刪除

智能指针的使用并不复杂,使用起来跟原始指针没太大区别,它们只是原始指针的 Wrapper Class (包装类)

原始指针的使用:

class A
{
   
};

int main()
{
   
    A* aptr = new A; // 在heap上分配内存
    delete aptr ; // 归还内存
    return 0;
}

共享指针的使用:

#include <memory>

int main()
{
   
	std::shared_ptr<A> asp1(new A); // 方法1
	std::shared_ptr<A> asp2 = std::make_shared<A>(); // 方法2

	A* a = new A(); 
	std::shared_ptr<A> asp3(a); // 方法3
	
	return 0;
}

以上三种构建共享指针方式都是合法的。我强烈反对以方法3的形式去构建共享指针,因为我认为这种行为非常危险。

事故现场1:

void shared(A* a)
{
   
    std::shared_ptr<A> asp(a);
}

int main()
{
   
	A* a = new A;
	shared(a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值