Adi*_*sak 2 c++ macros placement-new
我制作了几个宏,使得使用新的放置更容易一些.我只是想知道是否有任何明显的情况,这些都不会起作用.谢谢.
#define CONSTRUCT_INPLACE(TYPE,STORAGE,INIT) ::new((TYPE*)STORAGE) TYPE INIT
#define DESTRUCT_INPLACE(TYPE,STORAGE) ((TYPE*)STORAGE)->~TYPE()
Run Code Online (Sandbox Code Playgroud)
我不是新位置的专家,但是你如何定义宏有几个问题.
最明显的问题是使用演员表(TYPE*)STORAGE来存储位置.这是不正确的.Placement new只是另一个C++函数,它参与重载解析等操作.任意地将内存转换为特定类型可能会导致新的放置绑定到用户期望的不同运算符new.
例如,有以下两个placement new定义是有效的.您的宏可能会导致调用错误的宏.
void * _cdecl operator new(size_t cbSize, void* pv);
void * _cdecl operator new(size_t cbSize, SomeType* pv)-
Run Code Online (Sandbox Code Playgroud)
...
// These two call different overloads
void* p = malloc(sizeof(SomeType));
SomeType* f1 = CONSTRUCT_INPLACE(SomeType, p,())
SomeType* f2 = new (p) SomeType();
Run Code Online (Sandbox Code Playgroud)
我写了一篇博文,回顾了如何使用这种类型的重载决策来实现自定义分配器.
宏中的表达式STORAGE应该包含在parens中以防止恶意宏扩展错误.
::new((TYPE*)(STORAGE)) TYPE INIT
Run Code Online (Sandbox Code Playgroud)