抱歉,如果这已经在标准中明确说明过了,但我无法找到有关自动存储对象的内存是在封闭块的开头分配还是在执行构造函数之前立即分配的信息。我询问这个问题是因为 https://en.cppreference.com/w/cpp/language/storage_duration 上说到:
例如,我有类似于这样的东西。
存储期 程序中的所有对象都具有以下存储期之一:
现在,这是否意味着即使由于某种原因没有调用构造函数,也会分配存储空间?自动存储期。对象的存储空间在封闭代码块的开始时分配,在结束时释放。除了那些声明为 static、extern 或 thread_local 的对象外,所有局部对象都具有此存储期。
例如,我有类似于这样的东西。
{
if(somecondition1) throw something;
MyHugeObject o{};
/// do something
}
因此,可能存在MyHugeObject不需要构建的情况,但根据我引用的源代码,即使该对象可能永远不会被构建,仍然为其分配了内存。这是事实还是基于实现的?
MyHugeObject
的构造函数可能会引发异常,那该怎么办?因此,编译器不构造对象直到它实际需要使用才是有意义的。 - PaulMcKenziesomecondition
对于MyHugeObject
的构造没有影响,即使构造函数可能会throw
,内存仍然可以预先分配。最好将throw
后面的代码放在自己的{ }
块中,以确保安全。 - PaulMcKenzie