我有一个虚构的课程:
template<typename T> class demonstration
{
public:
demonstration(){}
...
T *m_data;
}
在程序执行的某个时刻,我想将m_data
设置为分配内存的大块并在那里构造一个对象T
。
目前,我一直在使用此代码:
void construct()
{
*m_data = T();
}
我现在意识到这可能不是最好的主意......如果T
有私人赋值运算符,那么在某些情况下不会工作。
有没有正常/更好的方式来做我在这里尝试的事情?
答案 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
运算符适合您的情况。