gpt4 book ai didi

c++ - 在同一个地址多次放置新的位置是否明确/合法?

转载 作者:IT老高 更新时间:2023-10-28 21:45:39 27 4
gpt4 key购买 nike

(注意:这个问题的动机是试图提出预处理器黑客来生成无操作分配来回答另一个问题:

Macro that accept new object

...请记住这一点!)

这是一个人为的类:

class foo {
private:
int bar;
public:
foo(int bar) : bar (bar)
{ std::cout << "construct foo #" << bar << std::endl; }
~foo()
{ std::cout << "destruct foo #" << bar << std::endl; }
};

...我将这样分配:

// Note: for alignment, don't use char* buffer with new char[sizeof(foo)] !
void* buffer = operator new(sizeof(foo));

foo* p1 = new (buffer) foo(1);
foo* p2 = new (buffer) foo(2);

/* p1->~foo(); */ /* not necessary per spec and problematic in gen. case */
p2->~foo();

在我使用的 gcc 上,我得到了“预期”的结果:

construct foo #1
construct foo #2
destruct foo #2

这很好,但编译器/运行时是否可以将其视为滥用而拒绝,并且仍然在规范的右侧?

线程怎么样?如果我们实际上并不关心这个类的内容(假设它只是一个虚拟对象),它至少不会崩溃,例如在更简单的应用程序中,它使用 POD int 来驱动它?

最佳答案

在同一 block 内存上多次执行 placement-new 非常好。此外,无论听起来多么奇怪,您甚至都不需要破坏已经存在于该内存中的对象(如果有的话)。该标准在 3.8/4 中明确允许这样做

4 A program may end the lifetime of any object by reusing the storage which the object occupies or by explicitly calling the destructor for an object of a class type with a non-trivial destructor. For an object of a class type with a non-trivial destructor, the program is not required to call the destructor explicitly before the storage which the object occupies is reused or released;[...]

换句话说,您有责任考虑不为某些对象调用析构函数的后果。

但是,不允许像在代码中那样对同一个对象调用析构函数两次。一旦您在同一内存区域中创建了第二个对象,您就有效地结束了第一个对象的生命周期(即使您从未调用过它的析构函数)。现在你只需要破坏第二个对象。

关于c++ - 在同一个地址多次放置新的位置是否明确/合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7524249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com