什么时候应该为强异常安全努力呢?

ID870177103 2017-10-21 10:39:50
以前天真的以为使用RAII来保证new-delete必定成对使用就能防止内存泄露
现在发现如果实现一个分配器类<T>,alloc时分配节点,然后用placement new初始化T
如果placement new失败,此时节点已经生成,于是异常造成僵尸节点
这个节点直到分配器析构前都会存在,因为alloc失败了,没有对象为之free
换句话说,如果这个分配器是静态全局的,那其实也算内存泄露了
这样就很尴尬了,如果我要回去审查其它部分的代码(好多),哪些地方还会可能有这种情况呢?
...全文
234 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-25
  • 打赏
  • 举报
回复
FancyMouse 2017-10-25
  • 打赏
  • 举报
回复
allocator本来就需要有对应设计。你自己想想假设现在要alloc一个长1000的数组,所以先alloc 1000*sizeof(T),然后每个调用placement new。这段代码怎么exception safe?这不是new delete对应的问题。allocator你是在实现new和delete,当然不一样。
ID870177103 2017-10-24
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
没有“银弹”!
感觉C++确实在诱使人们写下错误的代码,C++的框架只是看起来漂亮
ID870177103 2017-10-24
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
RAII 是指 资源获取就是初始化 跟内存泄露没有多大关系. 所以已经不是"天真"的问题了, 而是方向性的问题了. 代码中保证new和delete配对, 这个是关键. 要保证每个分支, 或者异常的情况下, 都能正确的配对执行, 否则泄露是必然的.
你没看清楚吧
赵4老师 2017-10-23
  • 打赏
  • 举报
回复
没有“银弹”!
xiaohuh421 2017-10-23
  • 打赏
  • 举报
回复
RAII 是指 资源获取就是初始化 跟内存泄露没有多大关系. 所以已经不是"天真"的问题了, 而是方向性的问题了. 代码中保证new和delete配对, 这个是关键. 要保证每个分支, 或者异常的情况下, 都能正确的配对执行, 否则泄露是必然的.

64,649

社区成员

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

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