【问题标题】:What makes placement new call the constructor of an object?是什么让placement new 调用对象的构造函数?
【发布时间】:2020-07-03 14:58:43
【问题描述】:

来自here

标准 C++ 库提供了一种放置形式 operator new 在标准头中声明为:

void *operator new(std::size_t, void *p) throw ();

大多数 C++ 实现将其定义为内联函数:

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

它只返回第二个参数的值。它 完全忽略它的第一个参数。异常规范 throw() 表示该函数不允许传播任何 例外。

我知道放置 new 只是对operator new 的重载,而且它在给定的内存地址上调用构造函数。

但是是什么让它调用构造函数呢?它只需要一个指针并再次返回它。取一个指针然后返回它有什么意义?为什么要将值传递给函数以将其取回?

【问题讨论】:

    标签: c++ new-operator allocation allocator placement-new


    【解决方案1】:

    但是是什么让它调用构造函数呢?

    operator newsemantics

    有关详细信息,请阅读 C++11 标准 n3337,了解 new expressions 或该标准的更新变体。

    当您定义一些operator new 时,稍后使用它会调用构造函数。根据 C++ 的定义。

    我推荐阅读一个好的C++ programming book

    练习:使用malloc、位置new 和一些throw expression 定义通常 operator new(在您的class MyClass)。

    【讨论】:

    • 感谢您的回答。 “和throw”是什么意思?
    • 我能够毫无问题地在全球范围内定义operator new(size_t)。但无法定义新的展示位置 (operator new(size_t, void*))。我收到一个错误redefinition of 'void* operator new(size_t, void*)'。为什么我可以重新定义 operator new 而不是 placement new
    • 另外,我在MyClass 中定义了新的展示位置。当我写new(ptr) MyClass 时,我定义的位置 new 被调用而不是全局位置。为什么只在 MyClass 中定义placement new 会用我定义的MyClass* 替换对任何全局placement new 的调用?也是语义吗?
    • @StackExchange123:“为什么我可以重新定义 operator new 而不能重新定义placement new?”因为标准是这样说的。您也不能为两个整数重载operator+。语言的基本部分(例如在一块存储中初始化对象的能力)不能被覆盖。
    猜你喜欢
    • 2010-09-26
    • 2021-08-31
    • 2014-08-07
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2015-10-17
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多