C++对象存储在堆栈或堆中

C++ Object is stored in stack or heap

本文关键字:堆栈 对象 存储 C++      更新时间:2023-10-16

我知道这个问题在 SO 中被问了很多,就像在堆栈/堆上的对象创建中一样?据我了解,如果一个对象存储在 Stack 中,如果变量超出范围,它就会被弹出。但是当涉及到自动存储时,它让我感到困惑,它怎么不在堆中。我读过不建议在C++中使用new和delete(甚至邪恶是单词的选择),因为它会导致内存泄漏。所以我设备这样的测试代码

#include <iostream>
#include <string>
class Cat
{
public:
    Cat(const std::string& name)
    {
        this->name = name;
        std::cout << "construct Cat " << this->name << std::endl;
    }
    ~Cat()
    {
        std::cout << "destruct Cat " << this->name << std::endl;
    }
    void feed()
    {
        std::cout << "feed Cat " << this->name << std::endl;
    }
private:
    std::string name;
};
Cat createFelix()
{
    Cat garfield("Garfield");
    Cat felix("Felix");
    garfield.feed();
    felix.feed();
    return felix;
}
void getAndFeedFelix()
{
    Cat justFelix = createFelix();
    justFelix.feed();
}
int main()
{
    getAndFeedFelix();
    std::cout << "bla bla blah" << std::endl;
}

结果是这样的

construct Cat Garfield
construct Cat Felix
feed Cat Garfield
feed Cat Felix
destruct Cat Garfield
feed Cat Felix
destruct Cat Felix
bla bla blah

所以在我的结论中,函数 createFelix() 是从返回 Cat(存储在堆栈中)的getAndFeedFelix()调用的,该 Cat 应该在函数返回后从堆栈中弹出,但在getAndFeedFelix()超出范围后对象被破坏,因为自动存储机制。怎么会这样?如果自动存储使用堆和引用计数,则可能是可能的。我的逻辑错了吗?

您已经发现了返回值优化(具体称为返回值优化)。

此函数:

Cat createFelix()
{
    Cat felix("Felix");
    return felix;
}
Cat justFelix = createFelix();

看起来它应该创建一个Cat,复制它并销毁它。但作为优化,createFelix()实际上在justFelix拥有的内存中创建felix。所以我们只创建一个Cat,零副本。这里的一切都在堆栈上。

那么:

void getAndFeedFelix()
{
    Cat justFelix = createFelix(); // creates a cat
    justFelix.feed();              // feeds a cat
}                                  // destroys a cat

这是您看到的输出。