关于使用智能指针时指针的释放问题

绿茶盖儿 2014-07-09 12:31:11
今天看C++ Primer中的智能指针(421-424页)。
有个问题一直想不通,如下:
首先指针是从外部送入类的内部,若类在析构的时候,其智能指针的计数器为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的地址所指向的内存,不就出错了吗
...全文
925 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-07-09
  • 打赏
  • 举报
回复
不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山! http://bbs.csdn.net/topics/390787357
modyaj 2014-07-09
  • 打赏
  • 举报
回复
智能指针并非那么智能!你要用它 就要好好遵守它的游戏规则!
就想叫yoko 2014-07-09
  • 打赏
  • 举报
回复
所以一般是一条语句,不会像你那样写 原始指针一般是不会暴露出来的,全都通过智能指针操作
  • 打赏
  • 举报
回复
你后边的两种情况都是误用智能指针的情况,不要期望智能指针能解决这些问题。这看起来更像是一个了解智能指针的开发者给新手做出的错误示例。
zilaishuichina 2014-07-09
  • 打赏
  • 举报
回复
通常ip 不会让逻辑拿到 比如可能是HasPtr p1(new int(42));
苏客达 2014-07-09
  • 打赏
  • 举报
回复
一般是 std::auto_ptr<int> ptr1(new int(5));

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧