我在想,什么时候应该在C++中在堆栈上分配类? 我在Java方面有很强的背景,在Java中,所有类都在堆上分配,使用new
关键字。 在C ++中,我可以选择在堆栈和堆上进行分配,但是现在智能指针已经引入,使用std::unique_ptr
分配不传递所有权的所有内容更合理。
我实在想不出任何情况下需要或更好地使用堆栈分配。也许在嵌入式系统中进行某种优化?
我在想,什么时候应该在C++中在堆栈上分配类? 我在Java方面有很强的背景,在Java中,所有类都在堆上分配,使用new
关键字。 在C ++中,我可以选择在堆栈和堆上进行分配,但是现在智能指针已经引入,使用std::unique_ptr
分配不传递所有权的所有内容更合理。
我实在想不出任何情况下需要或更好地使用堆栈分配。也许在嵌入式系统中进行某种优化?
for
, while
, if
等)的范围与对象需要的生命周期相符时,使用自动(堆栈)分配。这样,如果对象拥有/控制任何资源,例如动态分配的内存、文件句柄等,它们将在析构函数调用时释放,因为该范围已被离开。(不是在垃圾收集器以后的某个不可预测的时间)。仅在存在明显需要时才使用 new
,例如:
需要对象的生存期长于函数范围,
将所有权移交给其他代码,
具有指向基类的指针容器,然后可以对其进行多态处理(即使用虚派生类函数实现),或
特别大的分配将会占用大量的堆栈空间(您的操作系统/进程通常会谈判达成限制,通常在1-8+兆字节的范围内)。
std::unique_ptr<>
来管理动态内存,并确保无论如何离开该范围,都将释放它:通过 return
, throw
, break
等。(您也可以在 class
/struct
中使用 std::unique_ptr<>
数据成员来管理对象拥有的任何内存。)
std::unique_ptr
是一个基于“栈”(stack)的对象。顺便说一下,我们称它们为自动对象和动态对象,因为 C++ 没有堆栈概念。在我看来,尽可能使用自动对象是最好的选择。 - NathanOliver