例:
Class *_obj1;
Class *_obj2;
void doThis(Class *obj) {}
void create() {
Class *obj1 = new Class();
Class obj2;
doThis(obj1);
doThis(&obj2);
_obj1 = obj1;
_obj2 = &obj2;
}
int main (int argc, const char * argv[]) {
create();
_obj1->doSomething();
_obj2->doSomething();
return 0;
}
これにより、2 つのオブジェクトが作成され、それらへのポインターが作成され、次に main() がそれぞれのメソッドを呼び出します。Class オブジェクトは char* を作成し、C 文字列 "Hello!" を格納します。初期化; ~Class() デアロケータはメモリを解放します。doSomething() メソッドは、printf() を使用して "buff: %s" を出力します。十分に単純です。これを実行すると、次のようになります。
ディロック
バフ: こんにちは!
バフ:¯ø_ˇ
明らかに、スタック オブジェクトはここでは機能しません。関数が終了するとき、ポインター _obj2 がスタック内の場所を指していることは明らかです。これが、以前の質問でヒープ オブジェクトを使用した理由です。人々は私に「ばかげている」と言っていました。
したがって、最初の質問は、create() の終了後に割り当てが解除されないように、スタック オブジェクト (obj2) をヒープ オブジェクトに変換するにはどうすればよいかということです。多くの人がそうしてきたように、傲慢な「あなたは間違ったことをしている」ではなく、率直な答えが欲しい. この場合、スタックオブジェクトは機能しないため、ヒープオブジェクトが唯一の方法のようです。編集: また、スタック オブジェクトに変換することも同様に役立ちます。
2 番目の質問: ヒープ オブジェクトが「間違っている」具体的な例は、演算子vector<string>*
を使用して新しいオブジェクトを作成することでした。STL オブジェクトの動的割り当てが間違っている場合、正しい方法は何ですか? それらをスタックオブジェクトとして作成すると、すぐに割り当てが解除されるため失敗することは明らかですが、それらを動的に割り当てるとヒープが破損する可能性があると(非常に高いランクのメンバーから)言われました。それで、それを行う正しい方法は何ですか?new