こんにちは、事前に割り当てられたメモリを使用してオブジェクトと配列を作成して実験しています。たとえば、次のコードがあります。
int * prealloc = (int*)malloc(sizeof(Test));
Test *arr = new(prealloc) Test();
test は次のように定義されます。
class Test {
public:
Test() {
printf("In Constructor\n");
}
~Test() {
printf("In Destructor\n");
}
int val;
};
このシナリオで delete を呼び出すと、実際には悪いメモリが解放されます。b/c 何らかのタイプのメモリ マネージャーを使用している可能性があるため、問題が発生することは間違いありません。私はインターネットで検索しましたが、見つけた唯一の解決策は、デストラクタを明示的に呼び出してから無料で呼び出すことでした:
arr->~Test();
free(arr);
これを行う別の方法はありますか?おそらくdeleteを呼び出して、デストラクタを呼び出すだけでメモリを解放しないように指示する方法はありますか?
私の2番目の問題は、前の例のように、新しい事前割り当てメモリに渡すことができる配列を操作するときでした:
int * prealloc2 = (int*)malloc(sizeof(Test) * 10);
Test *arr2 = new(prealloc2) Test[10];
呼び出すdelete[]
と、配列内の各要素のデストラクタが呼び出されるだけでなく、望ましくないメモリも解放されます。実行する必要があることがわかった唯一の方法は、配列を調べてデストラクタを明示的に呼び出してから、free を呼び出すことです。通常の none 配列演算子と同様に、メモリを解放せずにデストラクタを呼び出すように演算子に指示する方法はありますか?
私が気づいたことの 1 つは、配列の new 演算子が実際には配列のサイズを格納するために最初の 4 バイトを使用することでした (私はこれを 32 ビット ビルドのビジュアル スタジオでのみテストしました)。配列にはありますが、まだ 1 つの問題があります。配列がポインター配列の場合はどうなりますか? 例えば:
Test **arr2 = new Test*[10];
誰かがこれらの質問で私を助けてくれませんか。