关于使用智能指针时指针的释放问题
今天看C++ Primer中的智能指针(421-424页)。
有个问题一直想不通,如下:
首先指针是从外部送入类的内部,若类在析构的时候,其智能指针的计数器为0,就会释放该指针的内存,
也就是说这个指针是在类的外部分配的内存,但却在类的内部释放。这不是很奇怪吗,不符合谁分配谁释放的原则啊。
比如下面这段代码。
用户为指针ip分配了内存,然后把ip送入HasPtr的对象p1, 当p1析构的时候,就会释放ip的内存。但是使用HasPtr类的用户未必知道ip的内存已经被释放了,所以他可能会这样写代码
这不就导致ip被重复释放了吗?
还有一个问题,如果传入类中的地址不是new出来的,类内部却会释放该地址的内存,不就出错了吗?比如下面这段代码
p1在析构的时候释放i的地址所指向的内存,不就出错了吗
有个问题一直想不通,如下:
首先指针是从外部送入类的内部,若类在析构的时候,其智能指针的计数器为0,就会释放该指针的内存,
也就是说这个指针是在类的外部分配的内存,但却在类的内部释放。这不是很奇怪吗,不符合谁分配谁释放的原则啊。
比如下面这段代码。
int *ip = new int(42);
HasPtr p1(ip); //HasPtr是一个带有智能指针的类
用户为指针ip分配了内存,然后把ip送入HasPtr的对象p1, 当p1析构的时候,就会释放ip的内存。但是使用HasPtr类的用户未必知道ip的内存已经被释放了,所以他可能会这样写代码
int *ip = new int(42);
HasPtr p1(ip);
delete ip;
这不就导致ip被重复释放了吗?
还有一个问题,如果传入类中的地址不是new出来的,类内部却会释放该地址的内存,不就出错了吗?比如下面这段代码
int i = 42;
HasPtr p1(&i);
p1在析构的时候释放i的地址所指向的内存,不就出错了吗
...全文
相关推荐
智能指针错误用法demo
通过分析这些案例,我们可以更深入地理解智能指针的潜在问题,并学习如何避免它们。记住,正确使用智能指针是确保C++程序内存管理的关键。
C++ 引用计数技术及智能指针的简单实现
这种方式可以有效地解决多智能指针共享同一对象时的内存管理问题,防止悬垂指针的出现。**智能指针的实现**实现智能指针通常有两种策略:辅助类和句柄类。
C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
需要注意不要混合使用`shared_ptr`和原始指针,以防止意外的内存释放。
Chromium学习之智能指针
为了解决这一难题,智能指针的概念应运而生。智能指针是一种包装原始指针的类模板,它可以在对象不再需要时自动释放内存。
C++智能指针 功能强大,高效
这将导致重复释放的问题,因为this指针已经被销毁了。因此,在使用智能指针时,我们需要小心避免这些常见的问题,以确保代码的正确性和可靠性。


