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

时间:2010-05-01 16:15:29

标签: c++ templates constructor

我有一个虚构的课程:

template<typename T> class demonstration
{  
    public:
    demonstration(){}
    ...
    T *m_data;
}

在程序执行的某个时刻,我想将m_data设置为分配内存的大块并在那里构造一个对象T

目前,我一直在使用此代码:

void construct()
{
    *m_data = T();
}

我现在意识到这可能不是最好的主意......如果T有私人赋值运算符,那么在某些情况下不会工作。

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

2 个答案:

答案 0 :(得分:8)

使用展示位置new

new (m_data) T();

放置new实际上只是operator new函数的重载,它接受一个额外的参数 - 应该在其中构造对象的内存位置。这与您的用例完全匹配。

特别是,这就是allocator通常实现construct方法的方法,该方法由STL容器类(以及其他方法)用于构造对象。

由于放置new只有构造一个对象而不分配内存,因此调用delete来摆脱内存通常是错误的。破坏必须通过直接调用析构函数来实现,没有释放内存:

m_data->~T();

请注意,调用析构函数的这种语法不适用于构造函数调用,否则我们首先不需要new new。即没有m_data->T()

答案 1 :(得分:1)

放置new运算符适合您的情况。