C++对象存储在堆栈或堆中
C++ Object is stored in stack or heap
我知道这个问题在 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
这是您看到的输出。
相关文章:
- 作为指针注入类后重新创建堆栈对象不好吗?
- 堆分配对象中的堆栈对象在 c++ 中在哪里分配?
- 模板堆栈对象的数组;语法
- 有效地分配堆栈对象(由函数的值返回)到堆?
- 堆栈对象的强制转换指针
- 指向堆栈对象的指针是否在超出范围时被删除
- 重建堆栈对象
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 堆栈对象"lost"会发生什么情况?
- 对 stl 堆栈对象大小的限制
- 堆栈对象"delete"的行为是什么?
- 为什么异常总是在具有可破坏堆栈对象的非叶函数中产生开销
- 是否可以为 CString 返回堆栈对象以及为什么 /GR 导致未定义的行为dynamic_cast
- 何时构造函数调用中的堆栈对象
- C++堆栈对象的构造函数异常处理
- 将没有成员的函子设置为类成员对象还是堆栈对象更有效
- 堆栈对象的动态强制转换失败
- 堆栈对象的最大大小
- 为什么我的堆栈对象在创建后会更改默认值
- 指向没有所有权的堆栈对象的指针