强制模板化对象从指针构造

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有一个私人任务操作员,在某些情况下不会工作.

是否有正常/更好的方式来做我在这里尝试的事情?

Kon*_*lph 8

使用位置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().