【问题标题】:Forcing a templated object to construct from a pointer强制模板化对象从指针构造
【发布时间】:2010-05-01 16:15:28
【问题描述】:

我有一个虚构的课程:

template<typename T> class demonstration
{  
    public:
    demonstration(){}
    ...
    T *m_data;
}

在程序执行的某个时刻,我想将m_data 设置为一大块已分配的内存并在那里构造一个对象T。

目前,我一直在使用这段代码:

void construct()
{
    *m_data = T();
}

我现在意识到这可能不是最好的主意...在某些情况下不起作用,例如,如果 T 有一个私有赋值运算符。

有没有一种正常/更好的方法来做我在这里尝试的事情?

【问题讨论】:

    标签: c++ templates constructor


    【解决方案1】:

    使用展示位置new:

    new (m_data) T();
    

    Placement new 实际上只是 operator new 函数的重载,它接受一个额外的参数——应该构造对象的内存位置。这完全符合您的用例。

    特别是,allocators 通常是这样实现 construct 方法的,该方法被 STL 容器类(除其他外)用于构造对象。

    由于放置new 只构造一个对象而不分配内存,调用delete 来释放内存通常是错误的。必须通过直接调用析构函数来进行销毁,不释放内存:

    m_data->~T();
    

    请注意,这种调用析构函数的语法不适用于构造函数调用,否则我们一开始就不需要放置 new。 IE。没有m_data-&gt;T()。

    【讨论】:

    • 所以placement new 只是用来在某个位置构造一个对象,正如我所需要的。它是否与展示位置删除一起使用?或者在这种情况下,新的可以独立吗?
    • @SalamiArmi:您没有使用任何“放置删除”。相反,您需要在完成后手动调用析构函数:m_data-&gt;~T()。这是因为delete 释放了内存。你只想摆脱那里的T。稍后您将不得不以某种方式释放m_data 指向的内存。
    • 感谢您澄清这一点,rlbond。只是好奇是否涉及一些奇怪的行为。感谢您的回答!
    • @SalamiArmi:很好看,我忘了提。我已经相应地更新了我的答案。但是@rlbond 已经给出了正确答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      相关资源
      最近更新 更多