不是new出来的内存也可以用delete释放吗?帮忙看下C++primer中的这段代码?

showming 2010-09-19 04:01:14
template <class T> class Handle {
public:
// unbound handle
Handle(T *p = 0): ptr(p), use(new size_t(1)) { } //构造函数,如果传递过来的实参是个数组名的话,
// overloaded operators to support pointer behavior ptr的值就不是new出来的指针,但是请看下面
T& operator*(); 析构函数还是有可能用delete释放内存。

T* operator->();
const T& operator*() const;
const T* operator->() const;
// copy control: normal pointer behavior, but last Handle deletes the object
Handle(const Handle& h): ptr(h.ptr), use(h.use)
{ ++*use; }
Handle& operator=(const Handle&);
~Handle() { rem_ref(); }
private:
T* ptr; // shared object
size_t *use; // count of how many Handle spointto *ptr
void rem_ref()
{ if (--*use == 0) { delete ptr; delete use; } }
};
...全文
336 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-09-20
  • 打赏
  • 举报
回复
这个是智能指针的一个实现,所以你再初始化的时候绝对不能传指向栈内存的指针。这个是使用的时候程序员自己保证的。
横云断岭 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 freezezdj 的回复:]

引用 4 楼 ayw215 的回复:

引用 2 楼 freezezdj 的回复:

及时结贴是美德!

嘿嘿
看来你的猩猩今天下午结不了了哦


呵呵,催着也没人结贴!
下午长了12分。
[/Quote]
…………
yshuise 2010-09-19
  • 打赏
  • 举报
回复
归根结底在于你提供的Handle支不支持?boost::shared_ptr提供析构函数的作为传入参数。
冻结 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ayw215 的回复:]

引用 2 楼 freezezdj 的回复:

及时结贴是美德!

嘿嘿
看来你的猩猩今天下午结不了了哦
[/Quote]

呵呵,催着也没人结贴!
下午长了12分。
yshuise 2010-09-19
  • 打赏
  • 举报
回复
这是一个约定,需要用new.即便是数组也不行,当然可以变形。
ayw215 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 freezezdj 的回复:]

及时结贴是美德!
[/Quote]
嘿嘿
看来你的猩猩今天下午结不了了哦
xingzhe2001 2010-09-19
  • 打赏
  • 举报
回复
看起来像智能指针。
那个ptr是外边的函数new出来传给它的,由它来负责销毁。
冻结 2010-09-19
  • 打赏
  • 举报
回复
及时结贴是美德!
冻结 2010-09-19
  • 打赏
  • 举报
回复
不是new的,绝不能delete。
但是你这儿ptr(p),有赋值,而这个p是new出来的才可以。
这样做不好。
因为你不知道p是new出来的还是&a;取地址得到的。
最好是在class里new。
在析构里delete。

64,643

社区成员

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

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