c++指针和动态内存管理

C++中动态内存的管理主要是使用new/delete表达式和std::allcator类。为了管理动态内存更加安全,C++11新标准库推出了智能指针。

new/delete

new完成的操作:
(1): 它分配足够存储一个特定类型对象的内存
(2):为它刚才分配的内存中的那个对象设定初始值。(对于内置类型对象,就是默认初始化该它,对应类类型,调用constructor初始化)

delete完成的操作:
(1):销毁给定指针指向的对象
(2):释放该对象的对应内存

常见问题

1.申请的空间没有进行释放,会出现内存泄漏。这种忘记释放的内存如果不退出程序将永远不会归还给系统。解决方法:

  • 在离开作用域前释放掉:
int *p=new int(0);
delete p;
p=nullptr;
//释放该指针后指向空,一可以避免再次访问它出现未定义行为,二可以避免再次delete它出现未定义行为。   

  • 接管申请的空间
int *pa;
{
   
	int *p=new int(0);
	pa=p;
}
delete pa;

2.使用已经释放内存的对象解决方法:对已经释放的内存对象赋给一个空指针,在使用前判断是否为空指针。

int *p=new int(0);
delete p;
p=nullptr;//也可=NULL/0
//......
if(p)
	{
   ......}

3.同一块内存释放两次,虽然这个问题听起来不太可能发生,但当有两个指针指向同一块内存时,可能就容易发生了。避免方法:delete后直接将内存对象置为空指针。

智能指针的使用及原理

什么是智能指针?
智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放,

RALL

RALL是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等)的技术。
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

智能指针的原理

  1. RAII特性
  2. 重载operator*和opertaor->,从而具有指针一样的行为。

使用RALL思想设计智能指针:

template<class T>
class SmartPtr 
{
   
public:
	SmartPtr(T* ptr = nullptr)
	: _ptr(ptr)
	{
   }
	~SmartPtr()
	{
   
		if(_ptr)
			delete _ptr;
	}
 
 T& operator*() 
 {
   
 	return *_ptr;
 }
 T* operator->(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值