TCPL 问题2: 如下代码有什么风险?

TheNewIpad 2014-05-25 05:41:13

阅读TCPL 第4版时,遇到一个看不明白的话

class Shape{......};

Shape* read_shape(int nStyle)
{
return new shape(...);
}

void user()
{
std::vector<Shape*>v;
while (...)
v.push_back(read_shape(...));

//....
for (auto p : v) delete p; // remember to delete elements
}

TCPL上说有两个风险
1、 A user might fail to delete the pointer returned by read_shape();
我理解是,在 v.pushback出错之后, 用户将不能删除ReadShape的堆内存
2、 The owner of a container of Shape pointers might not delete the objects pointed to.
我翻译这句话是:保存指向shape指针的容器 v不能删除指针指向的对象。 这怎么可能呢? 既然已经在我容器里面了,我怎么可能释放不了内存呢?

然后,书上接着说 std::unique_ptr 能解决问题。 unique_ptr 能解决问题2?
...全文
95 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
TheNewIpad 2014-05-25
  • 打赏
  • 举报
回复
引用 1 楼 jerry_dqh 的回复:
1 第一个问题,比如你存了一个指针,但可能这个指针已经在外面处理的时候释放了。 2 第一个问题你所讲的解释第二个问题。第二个问题不是不能,而是可能你不会删除,你翻译得有问题。 我想作者是想说,你的Vector中存的指针与内存可能有不同步的情况,可能外面释放了内存,但是你的vector很可能还保存了指针,也有可能你vector已经没有指针了,但你还没有释放掉。建议使用std::unique_ptr,就是不想发生这样的情况 如果你严格操作,pop的时候肯定释放一下,或者外面释放指针的时候,从vector将指针移除,当然是没有问题,但这样太累了,使用std::unique_ptr就比较方便了。
那基本就是作者说的不太清楚。 我翻译中的 “不能” ==> 不会,忘记之类的。 更合适。 呵呵。
碼上道 2014-05-25
  • 打赏
  • 举报
回复
1 第一个问题,比如你存了一个指针,但可能这个指针已经在外面处理的时候释放了。 2 第一个问题你所讲的解释第二个问题。第二个问题不是不能,而是可能你不会删除,你翻译得有问题。 我想作者是想说,你的Vector中存的指针与内存可能有不同步的情况,可能外面释放了内存,但是你的vector很可能还保存了指针,也有可能你vector已经没有指针了,但你还没有释放掉。建议使用std::unique_ptr,就是不想发生这样的情况 如果你严格操作,pop的时候肯定释放一下,或者外面释放指针的时候,从vector将指针移除,当然是没有问题,但这样太累了,使用std::unique_ptr就比较方便了。

64,654

社区成员

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

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