——————————— ダンスのない毎日は人生にとって失望です。
C++ の新しい位置付け
1. 新しいポジショニングとは
一般的な new オペレータは、リクエストを満たすのに十分な大きさのメモリ ブロックをヒープ内で見つける責任があります。
新しい配置 (Placement new) は、割り当てられたメモリ領域にオブジェクトを構築できるようにする C++ の演算子です。通常、new
キーワードを使用してオブジェクトを作成すると、システムは自動的にメモリを割り当て、その上にオブジェクトを構築します。新しい位置を指定すると、指定したメモリ位置にオブジェクトを構築できるようになります。
2. new の構文を見つける
new を配置するための構文は次のとおりです。
new (pointer) Type(arguments);
ここでpointer
、 は事前に割り当てられたメモリ領域へのポインタ、Type
は構築されるオブジェクトのタイプ、arguments
はオブジェクト コンストラクタに渡されるパラメータです。
Positioning New を使用する場合、Positioning New ではオブジェクトに新しいメモリが割り当てられないため、メモリの割り当てと解放を手動で管理する必要があります。事前に割り当てられたメモリ位置でオブジェクトのコンストラクターを呼び出して、オブジェクトを作成するだけです。
新しいものを配置するための主なアプリケーション シナリオは次のとおりです。
- メモリ プールやカスタム メモリ管理スキームなど、特定のメモリ領域にオブジェクトを構築します。
- 新しいメモリを割り当てるのではなく、割り当てられたメモリを再利用するために、既存のオブジェクト メモリ上のオブジェクトを再構築します。
- オブジェクトを構築するときは、特定の構築パラメータを渡す必要があります。
新しい位置決めを使用して構築されたオブジェクトの場合、対応するデストラクターを明示的に呼び出してオブジェクトを破棄する必要があり、関連するメモリを手動で解放する必要があることに注意してください。これは、新しい配置ではメモリの割り当て解除が自動的に管理されないためです。たとえば、obj->~Type()
を使用してデストラクターを呼び出すことにより、オブジェクトを破棄できます。
新しい機能の検索は高度な C++ 機能です。これを使用する場合は、メモリ管理とオブジェクトのライフサイクルの問題を慎重に処理し、オブジェクトの正しい構築と破壊を確保し、メモリ リークやダングリング ポインタなどの問題を回避する必要があります。
3. 具体例
#include "iostream";
using namespace std;
int main()
{
char buffer[512]; //chunk of memory内存池
int* p1, * p2, * p3, * p4;
//常规new:
p1 = new int[10];
//定位new:
p2 = new (buffer) int[10];
for (int i = 0; i < 10; ++i)
p1[i] = p2[i] = 20 - i;
cout << "p1 = " << p1 << endl; //常规new指向的地址
cout << "buffer = " << (void*)buffer << endl; //内存池地址
cout << "p2 = " << p2 << endl; //定位new指向的地址
cout << "p2[0] = " << p2[0] << endl;
delete[]p1;
p3 = new (buffer) int;
*p3 = 1;
cout << "p3 = " << p3 << endl;
cout << "p3[0] = " << *p3 << endl;
p4 = new (buffer + 10 * sizeof(int)) int;
cout << "p4 = " << p4 << endl;
return 0;
}
ps: この状況は、高同時実行メモリ プール プロジェクトで発生しました。