代码之家  ›  专栏  ›  技术社区  ›  Salami

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

  •  2
  • Salami  · 技术社区  · 15 年前

    我有一个虚构的班级:

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

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

    目前,我一直在使用以下代码:

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

    我现在意识到这可能不是最好的主意…在某些情况下不会工作,如果 T 例如,有一个私有分配运算符。

    有没有一个正常/更好的方法来做我想做的事情?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Konrad Rudolph    15 年前

    使用布局 new :

    new (m_data) T();
    

    安置 新的 真的只是一个超载的 operator new 函数,它接受一个附加参数“对象应在其中构造的内存位置”。这与您的用例完全匹配。

    尤其是,这就是 allocator S通常实现 construct 方法,由STL容器类(以及其他类)用于构造对象。

    自放置以来 新的 只有 建构 一个没有分配内存的对象,它通常是一个错误调用 delete 为了摆脱记忆。必须通过直接调用析构函数来进行破坏, 没有 释放内存:

    m_data->~T();
    

    注意,这种调用析构函数的语法对于构造函数调用不起作用,否则我们一开始就不需要新的放置。也就是说,没有 m_data->T() .

        2
  •  1
  •   M. Williams    15 年前

    安置 new 接线员是适合你情况的人。