重要的原因是堆栈是如何工作的。它只有推送和弹出操作。在释放所有推后的东西之前,你不能释放堆栈中的东西。或者换句话说,如果从堆栈中释放了某些东西,例如函数返回时函数调用的堆栈帧,那么堆栈中它上面的所有内存也将被释放(你最好确保它被正确销毁,见下文)。
程序通常需要独立于堆栈来存储数据。有两种方法:在编译时分配内存,作为静态数据,或者在空闲存储中分配,也称为堆。
当然可以有多个堆栈,事实上,在方便和有用的情况下,这也很常见。但它是通过使用堆栈容器变量来完成的,其类型为std::stack
,然后仅将其用作数据的额外堆栈。常见的处理器架构每个进程/线程只有一个“本机”堆栈,用于函数调用和堆栈变量,这些额外的堆栈始终是分开的并由程序代码创建,只是与列表、映射等相同的普通数据结构。
关于您问题中的代码,要指出的一点是,在现代 C++new
中,通常不赞成裸体。您应该使用 RAII 机制,例如智能指针:
void fun()
{
auto a = std::unique_ptr<A>{ new A }; // C++11 syntax
// object is automatically destroyed when a goes out of scope, no leak
// note: heap should be used like this only if there's a reason, including:
// - A is big, and might conceivably overflow the stack
// - ownership of object may get moved and outlive the unique_ptr
}
而您的具体问题“创建的对象存在于免费商店中,不能被 main() 函数使用。为什么要在免费商店中创建对象。 ”,好吧,在问题代码中,它不应该被创建在免费商店,没有理由。它应该只是简单的自动变量,当它超出范围时会自动销毁。