(注意:这个问题的动机是试图提出预处理器黑客来生成无操作分配来回答另一个问题:
......所以请记住这一点!)
这是一个人为的类:
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 来驱动它?