Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 强制模板化对象从指针构造_C++_Templates_Constructor - Fatal编程技术网

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容器类用来构造对象的方法的

由于placement
new
只构造一个对象而不分配内存,因此调用
delete
以清除内存通常是错误的。必须在不释放内存的情况下直接调用析构函数进行销毁:

m_data->~T();

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

Placement
new
运算符适合您的情况。

因此Placement new仅用于根据需要在某个位置构造对象。它是否与位置删除匹配?或者在这种情况下,新的可以独立吗?@SalamiArmi:你不能使用任何“位置删除”。相反,完成后需要手动调用析构函数:
m\u data->~T()
。这是因为
delete
释放内存。你只想摆脱那里的
T
。稍后您将不得不释放内存
m_data
以某种方式指向。感谢您清除这些,rlbond。我只是好奇是否有奇怪的行为。谢谢你的回答@萨拉米阿米:不错,我忘了提那个。我已经相应地更新了我的答案。但是@rlbond已经给出了正确的答案。
m_data->~T();