重建堆栈对象

Reconstructing stack object

本文关键字:对象 堆栈 重建      更新时间:2023-10-16

嗯,我知道这听起来很邪恶。我正在阅读这篇SO帖子,偶然发现了重建堆栈对象的技术。基本思想是:

{
    T obj(...);  // dtor will be called at end of scope
    obj.~T();    // YOLO
    new (&obj) T(...);
    // obj goes out of scope. The compiler inserts `obj.~T();` here.
}

。这样我们就可以根据需要多次重复使用相同的内存块。按照标准,此代码是否合法?疯狂是这种不确定的行为吗?

此构造应用放置 new。另请参阅。这是标准C++自第一个标准以来。它早于第一个标准,并被引入核心语言,因为它有用。所以不是"疯狂"自然不是UB本身。当然,您可能会不小心在混凝土中挑起UB或其他内存错误安置新申请。与提供的所有原始内存管理工具一样根据语言,现在最好留给标准库的实现者和 3rd 方库,这些库预先满足了我们与其争论的需要风险。