- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
免责声明:这是一个微妙的 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/
我是一名优秀的程序员,十分优秀!