Destructor Gotcha(Delegating Constructors in C++11)

marcus2006 2014-06-14 11:26:29
问题来源:http://741mhz.com/delegating-constructors/
运行环境:VS2013 ,Win7 64bit, 中文
作者有一段话:
As a result, such a faulty program would try to delete an instance of P2 object twice (and runtime would hopefully abort the program):

问题1:我不明白的是为什么是twice??
问题2: 我把作者的例子放进VS2013里运行,结果却有不同!!为什么
int main() {
try {
A a2(7.5, std::unique_ptr<P2>(new P2));
} catch(const std::exception&) {
}
}
我在运行到
~A() {
std::cout << "A::~A()" << std::endl;
delete p;
}
输出了
A::~A()
P::~P()
然后弹出窗口提示触发断点
"HEAP[MFCSolution.exe]: Invalid address specified to RtlValidateHeap( 00F50000, 00F9615C )
MFCSolution.exe 已触发了一个断点。"

我可以看到断点停在了afxmem.cpp里的
if defined(_DEBUG)
_free_dbg(p, _NORMAL_BLOCK); //指向这里!!停住了

但作者输出的是
A::~A()
P2::~P2()
P1::~P1()
P1::~P1()



...全文
96 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2014-06-16
  • 打赏
  • 举报
回复
引用 2 楼 Marcus2006 的回复:
1楼朋友,我真心无语。我肯定知道作者是故意写的烂程序,所以特意去尝试运行一次看看效果。我手上有好几本c++的好书(C++ Primer第6版英文,Ivor Horton's Beginning VC++ 2012 英文),但毕竟他们不一定每个地方都写得很细,所以作者的文章是可以借鉴的!! [quote=引用 1 楼 ri_aje 的回复:] 1. 因为 ~A 和 ~unique_ptr 都会试图 delete 同一个对象。 2. 所以作者说:This, however, would trigger undefined behavior。UB 没有一定的表现形式,否则就不用叫未定义行为了。 ps. 引贴中的例子是为了表现问题而故意写的烂程序,楼主还是多看点儿权威的好书吧。
[/quote] 就当我什么都没说吧。
taodm 2014-06-15
  • 打赏
  • 举报
回复
神啊,C++ primer都有第六版了。
marcus2006 2014-06-15
  • 打赏
  • 举报
回复
1楼朋友,我真心无语。我肯定知道作者是故意写的烂程序,所以特意去尝试运行一次看看效果。我手上有好几本c++的好书(C++ Primer第6版英文,Ivor Horton's Beginning VC++ 2012 英文),但毕竟他们不一定每个地方都写得很细,所以作者的文章是可以借鉴的!!
引用 1 楼 ri_aje 的回复:
1. 因为 ~A 和 ~unique_ptr 都会试图 delete 同一个对象。 2. 所以作者说:This, however, would trigger undefined behavior。UB 没有一定的表现形式,否则就不用叫未定义行为了。 ps. 引贴中的例子是为了表现问题而故意写的烂程序,楼主还是多看点儿权威的好书吧。
ri_aje 2014-06-15
  • 打赏
  • 举报
回复
1. 因为 ~A 和 ~unique_ptr 都会试图 delete 同一个对象。 2. 所以作者说:This, however, would trigger undefined behavior。UB 没有一定的表现形式,否则就不用叫未定义行为了。 ps. 引贴中的例子是为了表现问题而故意写的烂程序,楼主还是多看点儿权威的好书吧。

64,282

社区成员

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

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