代码之家  ›  专栏  ›  技术社区  ›  Peter VARGA

同义函数调用::new((void*)p)T(value);

  •  1
  • Peter VARGA  · 技术社区  · 9 年前

    我想写我自己的 Allocator 可用于STL。到目前为止,我几乎可以成功完成,但有一个功能我有问题:

    这个 分配器 STL中使用的应提供以下功能 construct [来自标准分配器的示例,使用 new & delete ]:

    // initialize elements of allocated storage p with value value
    void construct (T* p, const T& value)
    {
        ::new((void*)p)T(value);
    }
    

    我被困在如何用我自己的函数重写它,它替换了 关键字初始化它 value .

    此函数 建筑 例如,在本代码中使用: fileLines.push_back( fileLine );

    哪里

    MyVector<MyString>      fileLines;
    MyString                fileLine;
    

    这些是我的 typedefs 我用自己的 分配器 :

    template <typename T> using MyVector = std::vector<T, Allocator<T>>;
    using MyString = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
    

    我很困惑,因为这里分配了一个 pointer T 例如[当我正确理解时] MySstring .

    我是否正确理解了指针-由 -将有10个字节,当 价值 123456789 然后提供 价值 是否复制到新指针?

    我的问题:

    如何使用我自己的函数重写一行代码?对于我来说 困难的 关键是如何得到 价值 [可以有任何类型],以便我能够正确确定分配的块的长度以及如何 复制 按顺序它适用于所有可能的类型 T ?

    2 回复  |  直到 9 年前
        1
  •  6
  •   Some programmer dude    9 年前

    这个 new 中的运算符 construct 函数根本不分配任何内容,它是一个 放置新 调用,它占用已经分配的内存块(需要以前以某种方式分配,至少与 sizeof(T) )并将其初始化为 T 对象,方法是调用 T 假装记忆指向 p 是一个 T 对象

        2
  •  2
  •   Yakk - Adam Nevraumont    9 年前

    ::new int(7) 调用默认值 new 操作员,获取足够大的内存 int ,并构造一个 整数 具有值 7 在其中。

    ::new(ptr) int(7) 需要一个 void* 打电话 ptr ,并构造一个 整数 具有值 7. 在其中。这称为“新放置”。

    重要的是第二段缺少什么。它不会创建空间,而是在某些现有空间中构造对象。

    就像说 ptr->T::T() ptr->int::int(7) 其中我们“调用构造函数 of 整数 on the memory location of 聚四氟乙烯 , except ptr->T: :T() or ptr->整数::int(7) are not valid syntaxes. Placement new`是在C++中显式调用构造函数的方法。

    同样, ptr->~T() ptr->~int() 将对位于的对象调用析构函数 聚四氟乙烯 (然而,没有 ~int 所以这是一个错误,除非 整数 是一个模板或依赖类型,在这种情况下,它是一个伪析构函数,调用被忽略,而不是生成错误)。

    你很少想改变 construct 从分配器中的默认实现。如果您的分配器希望跟踪对象的创建并附加有关其参数的信息,而不想干预地修改构造函数,那么您可以这样做。但这是一个角落案例。

    推荐文章