在C++中调用函数时构造了多少个对象

How many objects have been constructed while calling a function in C++

本文关键字:多少 对象 C++ 调用 函数      更新时间:2023-10-16

我编写了一个程序来测试在程序的生命周期中将构造多少个对象,如下所示:

class T
{
public:
    virtual ~T() {cout << "dtor" << endl;}
};
const T* func() 
{
    T objinfunc;
    return &objinfunc;
}
int main() 
{
    T objinmain = *func();
    return 0;
}

我希望它会打印"dtor"三次以破坏三个对象,例如 objinfunc、return object 和 objinmain,但它最终会打印两个"dtor"。

我对结果感到困惑。

您在此处返回本地地址:

const T* func() 
{
    T objinfunc;
    return &objinfunc;
}

这会产生未定义的行为。 objinfunc函数返回时已被销毁,您正在获取不再存在的地址。

除此之外,您还可以构造对象的两个实例:一个在func中,另一个在main中(至少您尝试这样做)。

除了您的代码没有定义行为之外,两次"dtor"是正确的,因为您返回的指针指向func中的T。你的第三个对象(返回对象)并不是真正的对象,因为它只是一个指针,最终将指向释放的内存。