对于隐式定义的构造函数/析构函数,如何通过调试器检查值
How can we examine the value through debugger, for implicitly defined constructor/Destructor ?
如何通过调试器检查隐式定义的构造函数/析构函数的值?
class base
{
int a;
public:
};
int main()
{
base b;
return 0;
}
由于这里没有提供任何构造函数/析构函数,它应该由编译器隐式提供(声明和定义)(按照书上的规定)。我如何使用调试器验证这一点。我尝试放置一些断点,但不完全理解它是如何工作的。
在示例代码中隐式构造函数必须做什么?根据gdb,函数base::base()
没有在g++ 4.7.3生成的目标代码中定义:
(gdb) b base::base()
Function "base::base()" not defined.
该构造函数的一个简单任务,比如存在于需要调用它的派生类中,将使编译器有必要合成它:
class base
{
int a;
public:
};
class derived : public base
{
public:
derived() {};
};
int main(int argc, const char *argv[])
{
derived d;
return 0;
}
现在可以调试base::base()
函数了:
(gdb) b base::base()
Breakpoint 1 at 0x400516: file test_impl_ctr.cpp, line 1.
当然,在构造函数的空实现中(在本例中)没有什么可发现的,但是好奇心得到了满足:)!
忘记构造函数-您的类 base
甚至不能保证在程序编译后以任何有意义的形式存在。实际上,优化编译器可能会完全删除它,只为int base::a
分配堆栈空间。
类、构造函数、析构函数、函数等都是作为c++编程概念存在的概念抽象,并由标准保证产生一定的行为。一旦你编译了程序并检查了汇编指令,你不一定会发现实际的机器指令和c++编程概念/抽象之间有任何对应关系。
因此,由于隐式定义的构造函数实际上不做任何事情,编译器没有义务为它生成任何实际代码。从概念上讲,它仍然作为c++概念存在,但它不一定由任何实际的机器码实现。假设是visual studio,您可以通过在声明b
的行中放置一个断点来查看生成的汇编代码,让它碰到断点,然后按Alt+8。然而,默认构造函数/析构函数除了调用每个成员的构造函数/析构函数之外,不起任何作用,在您的例子中,这些成员将为空。
根据c++标准,c++编译器的行为就好像完成了您书中解释的所有事情一样。但是,如果这些东西没有可见的行为,例如发出一些输出,则可以自由地跳过它们。
由于示例中的程序不包含任何具有可见效果的代码,编译器很可能生成一个什么都不做的可执行文件
相关文章:
- 正在VS调试器中监视映射条目
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 为什么我的 VS 代码调试器在我的C++代码周围弹跳?
- 带有 GDB 调试器的 VS 代码内存视图
- 为什么调试器引发"read access violation. this was nullptr"异常?
- VS2017调试器:没有地址,可能是由于编译器优化
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 使用 Windows 10 和 MINGW 编译器在 VS Code 上使用 gdb 调试器进行调试时出错
- 通过包装器从 C 访问C++ API 时,如何访问枚举类型
- 如何在可视化代码中生成用于 c++ 开发的调试器?
- 为什么我的程序无法在GDB在线编译器/调试器或Visual Studio C++ 2019中运行
- Popen使Qt调试器崩溃
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 在集成终端上运行vscode lldb调试器时,如何获取程序的输出?
- 宏使枚举调试器感知?
- Eclipse-C++-调试器立即终止
- 标识gdb调试器中符号的源文件名
- 按值传递的参数在 Visual Studio 2010, C++ 的调试器中显示为通过引用传递
- 当函数通过异常离开时C++闯入调试器
- 对于隐式定义的构造函数/析构函数,如何通过调试器检查值