很抱歉,是否曾经有人问过它,或者在标准中有明确的说过,但是我找不到在封闭块的开头还是在执行构造函数之前是否已为具有自动存储功能的对象分配了内存?
我问这个是因为https://en.cppreference.com/w/cpp/language/storage_duration这样说。
保存期限程序中的所有对象均具有以下存储时间之一:
自动存储期限。对象的存储空间在封闭代码块的开头分配,并在结尾处重新分配。除了声明为static,extern或thread_local的那些对象外,所有本地对象都具有此存储期限。
现在,这意味着即使出于某种原因未调用构造函数的情况,也仍分配了sturage空间?
例如,我有类似的东西。
{
if(somecondition1) throw something;
MyHugeObject o{};
/// do something
}
因此,有可能不需要构造MyHugeObject,但是根据我引用的来源,尽管实际上可能永远不会构造该对象,但仍会为其分配内存。是这种情况还是基于实现的东西?
从system回收内存的时刻取决于实现。标准唯一规定的是构造函数被调用以及对象可以安全使用的时刻。
常见实现使用堆栈作为自动存储持续时间对象,大多数情况下,allocate在整个块的开头整帧,然后在整个块的末尾弹出。即使堆栈操作很快,限制它们的数量也更简单,并且更简单也更可靠。
但是无论如何,即使标准没有规定使用堆栈作为自动存储持续时间,也不是指将帧分配到和从]弹出]的那一刻。
首先,从语言标准的角度来看,您不能在对象生命周期之外访问对象的存储空间
C ++标准在[basic.stc]