C++ 强制模板化对象从指针构造
我有一个虚构的班级:C++ 强制模板化对象从指针构造,c++,templates,constructor,C++,Templates,Constructor,我有一个虚构的班级: template<typename T> class demonstration { public: demonstration(){} ... T *m_data; } 我现在意识到这可能不是最好的主意。。。例如,如果T有一个私有赋值操作符,则在某些情况下不工作 有没有正常/更好的方法来完成我在这里尝试的任务?使用placementnew: new (m_data) T(); Placementnew实际上只是操作符ne
template<typename T> class demonstration
{
public:
demonstration(){}
...
T *m_data;
}
我现在意识到这可能不是最好的主意。。。例如,如果T
有一个私有赋值操作符,则在某些情况下不工作
有没有正常/更好的方法来完成我在这里尝试的任务?使用placement
new
:
new (m_data) T();
Placement
new
实际上只是操作符new
函数的一个重载,它接受一个额外的参数–对象应该构建在的内存位置。这完全符合您的用例
特别是,allocator
s通常就是这样实现STL容器类用来构造对象的方法的
由于placementnew
只构造一个对象而不分配内存,因此调用delete
以清除内存通常是错误的。必须在不释放内存的情况下直接调用析构函数进行销毁:
m_data->~T();
请注意,这种调用析构函数的语法不适用于构造函数调用,否则我们首先就不需要新的位置。也就是说,没有
m_data->T()
Placementnew
运算符适合您的情况。因此Placement new仅用于根据需要在某个位置构造对象。它是否与位置删除匹配?或者在这种情况下,新的可以独立吗?@SalamiArmi:你不能使用任何“位置删除”。相反,完成后需要手动调用析构函数:m\u data->~T()
。这是因为delete
释放内存。你只想摆脱那里的T
。稍后您将不得不释放内存m_data
以某种方式指向。感谢您清除这些,rlbond。我只是好奇是否有奇怪的行为。谢谢你的回答@萨拉米阿米:不错,我忘了提那个。我已经相应地更新了我的答案。但是@rlbond已经给出了正确的答案。
m_data->~T();