c++ - placement new 如何在指定内存上构造对象
PHPz
PHPz 2017-04-17 15:21:05
0
2
583
// Default placement versions of operator new.
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }

如上,查看gcc中stl的源代码的实现方式。placement new 只是返回__p指针。若

class XX
{
    //define ctor,dctor here
    //data member
};
char buf[sizeof(XX)];
XX* ptr = new(buf) XX();

像上面这样使用placement new,请问XX是如何在那个指定的内存buf上完成构造的呢?明明只是把指针返回了啊。

PHPz
PHPz

学习是最好的投资!

全員に返信(2)
伊谢尔伦

まず第一に、ここで呼び出しているプレースメント new は、ヘッダー ファイル new で定義されているプレースメント new ではありません。 ::operator new(...); と書く必要があります。

この配置 new に関して、C++ 標準には次のステートメントがあります (C++11):
18.6.1.3 配置フォーム [new.delete.placement]
1 これらの関数は予約されており、C++ プログラムです。標準 C++ ライブラリ (17.6.4) のバージョンを置き換える関数を定義することはできません。(3.7.4) の規定は、これらの予約された配置形式の演算子 new および演算子 delete には適用されません。

一般的な考え方は、これらの関数はそこに予約されており、現時点では移動できないということです。

いいねを押す +0
大家讲道理

構造体を初期化する方法を検討します。
メモリが割り当てられている限り、このメモリを必要な型に再解釈キャストできます。このプロセスにより、クラスのメンバー変数が独自のメモリ空間を持つことができ、この型のコンストラクターを呼び出すことができます。原理。新しいプレースメントを手動で実装することもできます

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート