Sal*_*ami 2 c++ templates constructor
我有一个虚构的课:
template<typename T> class demonstration
{
public:
demonstration(){}
...
T *m_data;
}
Run Code Online (Sandbox Code Playgroud)
在程序执行的某个时刻,我想设置m_data一个大块的已分配内存并在T那里构造一个对象.
目前,我一直在使用这段代码:
void construct()
{
*m_data = T();
}
Run Code Online (Sandbox Code Playgroud)
我现在意识到这可能不是最好的想法......如果T有一个私人任务操作员,在某些情况下不会工作.
是否有正常/更好的方式来做我在这里尝试的事情?
使用位置new:
new (m_data) T();
Run Code Online (Sandbox Code Playgroud)
放置new实际上只是operator new函数的重载,它接受一个额外的参数 - 应该在其中构造对象的内存位置.这与您的用例完全匹配.
特别是,这allocator通常是如何实现constructSTL容器类(以及其他)用于构造对象的方法.
由于placement new只构造一个对象而不分配内存,因此调用它delete来摆脱内存通常是一个错误.破坏必须通过直接调用析构函数来实现,而不释放内存:
m_data->~T();
Run Code Online (Sandbox Code Playgroud)
请注意,调用析构函数的这种语法不适用于构造函数调用,否则我们首先不需要new new.即没有m_data->T().