【问题标题】:Magic in placement new?新的放置魔术?
【发布时间】:2009-11-13 20:50:49
【问题描述】:

我正在“手动”进行动态内存分配,我想看看 MS 的人是如何实现新位置的,但是在调试时我“步入”它让我开始编写代码:

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{   // construct array with placement at _Where
return (_Where);
}

当我在这段代码中看到的所有内容都与我作为参数提供的返回语句一致时,任何人都可以向我解释这段代码究竟是如何将我的对象放置在指针所指向的位置上的。我不认为在评论中说我希望这个 fnc 做什么实际上足以让它工作。 感谢您提供任何建设性的答案。

【问题讨论】:

    标签: c++ memory-management placement-new


    【解决方案1】:

    operator new 的目的只是为一个对象分配内存,并返回指向该内存的指针。当你使用placement new时,你实际上是在告诉编译器“我知道这块内存是好的,跳过分配,并为我的对象使用这个指针。”然后使用operator new 提供的指针调用对象的构造函数,无论它是刚刚分配的内存,还是使用placement new 指定的。 operator new 本身与对象的构造方式没有任何关系。

    【讨论】:

    • 这意味着你最好注意有足够的空间来容纳传递的size_t,否则你会遇到麻烦......
    【解决方案2】:

    请记住,new T(...)(称为“新表达式”)的作用是两件事:分配内存和初始化对象。您可以通过编写构造函数来调整初始化。对于分配你写operator new。所以尽管有这个名字,operator new 只做了新表达式的一方面。

    Placement new 用于将对象放入预先分配的内存中。您不能调用构造函数,直接将预分配的内存作为this 指针传递。你唯一能做的就是使用placement new:这会将分配变成无操作,只剩下构造需要完成。这个

    inline void* operator new(size_t, void *p) throw()
    {
      return p;
    }
    

    只是那个无操作的实现。

    【讨论】:

    • @sbi ::如何为数组做一个新的放置?请参考我的代码link
    • @Atul:我不确定我是否理解你的代码。无论如何,您所做的是在足够大的内存块中创建数组的各个元素。然而,std::vector 正是这样做的,并且也有很多花里胡哨的东西。另外,与您自己的代码相比,它出现错误的可能性要小得多。那么为什么不直接使用它呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2012-01-05
    • 2015-08-22
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多