gpt4 book ai didi

C++ 就地构造和后续销毁 : how do I get the right pointer?

转载 作者:太空狗 更新时间:2023-10-29 20:23:37 25 4
gpt4 key购买 nike

免责声明:这是一个微妙的 C++ 问题,与严格阅读 C++ 规范密切相关。

在C++中,传统的就地构造方式是:

void * pStorage = myPooledAllocationFunction ( /*pool number*/1 ) ; // allocate from pool number 1, for example
MyClass * p = new (pStorage) MyClass () ;

然而,重要的是要注意 reinterpret_cast<void*> ( p )不一定等于 pStorage .

旁注:当我刚刚读到 placement-new 可以做更多的事情时,我感到很震惊,因为它实际上只是在说“请使用这个额外的参数调用 operator new”,而使用它的传统方式恰好发生在 C++ 中有一个默认实现。

我相信释放这个新创建对象的传统方法是这样的:

p->~MyClass() ;
myPoolDeallocationFunction ( /*pool number*/1 ) ; // deallocate pool 1 in its entirety

假设您有能力做到这一点。但如果你不是呢?如果您需要从 p 取回原始指针怎么办? ?

这有效吗?

p->~MyClass() ;
myPooledDeallocationFunction ( static_cast<void*> ( p ) ) ;

C++ 规范 (C++2003: 5.2.9.10) 指定使用 static_cast 是有效的从 MyClass* 转换至 void*然后回到MyClass* .

还有一个与此相关的提及(C++2003: 3.8.5),指定您可以在调用析构函数之后但在释放内存之前,做一组非常具体的事情来那个指针。出于我们的目的,我们关心的是它包括将其转换为 void* (这是有效的,因为旧指针“指向有效内存”)。

它没有说明是否 void*是原来的void*用于就地施工。

那么:如何从结果指针中获取用于就地构造的原始指针

最佳答案

您可以使用 dynamic_cast<void*>从基类中检索原始指针。生成的指针将始终指向派生程度最高的类,也就是整个对象。

据我所知,pStorage 是非法的和 p是不同的地址。

关于C++ 就地构造和后续销毁 : how do I get the right pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32161743/

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