对于隐式定义的构造函数/析构函数,如何通过调试器检查值

How can we examine the value through debugger, for implicitly defined constructor/Destructor ?

本文关键字:何通过 调试器 检查 析构函数 定义 于隐式 构造函数      更新时间:2023-10-16

如何通过调试器检查隐式定义的构造函数/析构函数的值?

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++编译器的行为就好像完成了您书中解释的所有事情一样。但是,如果这些东西没有可见的行为,例如发出一些输出,则可以自由地跳过它们。

由于示例中的程序不包含任何具有可见效果的代码,编译器很可能生成一个什么都不做的可执行文件