我有一个虚构的类:
template<typename T> class demonstration
{
public:
demonstration(){}
...
T *m_data;
}
在程序执行的某个时刻,我想将 m_data
设置为一大块已分配的内存,并在那里构造一个对象 T
。
目前,我一直在使用这段代码:
void construct()
{
*m_data = T();
}
我现在意识到这可能不是最好的主意......在某些情况下不会工作,例如,如果 T
有一个私有(private)赋值运算符。
是否有正常/更好的方法来完成我在这里尝试的事情?
最佳答案
使用放置新
:
new (m_data) T();
Placement new
实际上只是 operator new
函数的重载,它接受一个额外的参数——对象应该被构建的内存位置。这完全符合您的用例。
特别是,allocator
通常是这样实现 construct
的STL 容器类(除其他外)用来构造对象的方法。
由于 placement new
仅构造一个对象而没有分配内存,因此调用 delete
来清除内存通常是错误的。销毁必须通过直接调用析构函数来进行,无需释放内存:
m_data->~T();
请注意,这种调用析构函数的语法不适用于构造函数调用,否则我们一开始就不需要放置新的。 IE。没有 m_data->T()
。
关于c++ - 强制模板化对象从指针构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2750644/