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

标签 c++ templates constructor

我有一个虚构的类:

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/

相关文章:

c++ - 单例中的全局对象

c++ - 什么是具有自己类类型的良好二维数组替代方案

javascript - 如何将脚本传递给 main.scala.html - Play ! 2个

java - 使用 final 成员处理构造函数中捕获的 Java 异常

oop - Dlang : why are constructors not inherieted?

C++ 进程管理

c++ - 如何在 boost tcp/udp 服务器中处理 control-c

javascript - 自定义方法以及构造函数和原型(prototype)在 web-dev 中的用处

c++ - 动态分配模板类时出现编译器错误,其中类型是模板类型的另一个对象

c++ - 模板问题 - 将函数作为参数传递时遇到问题(非静态成员函数的使用无效)