私は常にヒープ上で動的に割り当てを行ってきました。私は普通の C と同様に多くの Objective-C プログラミングを行ってきました。通常は大量のメモリを扱うので、スタック オーバーフローを防ぐためにヒープ オブジェクトが必要です。
私は最近、C++ では動的に割り当てられたオブジェクトを使用することは推奨されておらず、可能な限りスタック オブジェクトを使用する必要があると言われました。どうしてこれなの?
これを説明する最良の方法は、例によるものだと思います。
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()
メソッドは を使用して出力し"buff: %s"
ますprintf()
。十分に単純です。それでは実行してみましょう:
ディロック
バフ: こんにちは!
バフ:¯ø_ˇ
おっと、どうしたの?C++_obj2
は、それへのポインターを格納したにもかかわらず、その割り当てを解除しました。これは、ヒープではなくスタック上にあり、C++ には Objective-C のようなリテイン カウント メカニズムがないためです (ある時点で実装を試みましたが、完全に機能しましたが、スーパークラスとしてすべてに追加する気がしませんでした)。したがって、関数が戻った後もそれを維持するために、フープをジャンプする必要があります。