类构造函数从未在发布模式下执行

Posted

技术标签:

【中文标题】类构造函数从未在发布模式下执行【英文标题】:Class Constructor never executed in release mode 【发布时间】:2008-10-29 22:55:01 【问题描述】:

正是标题所说的。我正在使用 MSVC++ 2008 express,并且在发布模式下编译时,我的类构造函数永远不会执行。它确实在调试模式下工作。

我正在做类似的事情:

ClassTest test;
test.DoIt();

DoIt(); 上的断点会触发,但ClassTest::ClassTest(); 上的断点不会。

【问题讨论】:

【参考方案1】:

只是一个想法 - 可能是发布模式下的编译器优化防止断点被击中。如果构造函数没有做任何事情(即它是无操作的),则可能会发生这种情况。尝试在构造函数中添加一些简单的语句,例如

    声明一个局部变量 初始化变量 以某种方式使用它(例如打印出来)

然后在上面的第(3)步添加一个断点,看看是否命中了这个断点。

由于进行了优化,您可以看到在发布模式下命中断点的方式存在各种奇怪的调试问题。

【讨论】:

这是正确的,但是如果你声明并初始化一个int,然后不使用它,它仍然可能被优化掉,导致断点不触发。您想包含一个具有外部副作用的语句,以便编译器无法优化它。 原来我是个笨蛋,构造函数正在执行。我不小心将 wsa.wVersion 作为第一个参数提供给 WSAStartup,而不是使用 MAKEWORD,由于某种原因,它似乎在调试模式下工作。 谢谢马特 - 这是一个很好的观点。初始化变量是首先想到的只是为了测试理论,但实际使用变量也非常重要。我会更新答案。

以上是关于类构造函数从未在发布模式下执行的主要内容,如果未能解决你的问题,请参考以下文章

二阶构造模式

C++--二阶构造模式

第27课二阶构造模式(上)---------出现的背景

类构造块,this(),static,单例模式串讲

初始化在构造函数中实现自身的类模板

Flutter 6种构造函数详解