有时,我看到存储持续时间和发生地点之间存在混合概念。那是因为有时我会看到以下声明:
int i; // This is in the stack!
int* j = new int; // This is in the heap!
但这真的 100% 正确吗?C++ 是否确保存储发生在哪里?或者,它是由编译器决定的?
存储位置是否与持续时间无关?
例如,取这两个片段:
void something()
{
int i;
std::cout << "i is " << i << std::endl;
}
与:
void something()
{
int* i = new int;
std::cout << "i is " << i << std::endl;
delete i;
}
两者都或多或少等效于 的生命周期i
,它在块的开头创建并在块的末尾删除,这里编译器可以只使用堆栈(我不知道!),相反的情况也可能发生:
void something()
{
int n[100000000]; // Man this is big
}
与:
void something()
{
int* n = new int[100000000];
delete n;
}
这两种情况应该在堆中以避免堆栈溢出(或者至少是到目前为止我被告知的......),除了存储持续时间之外,编译器是否也考虑到了这一点?