-4

私は常にヒープ上で動的に割り当てを行ってきました。私は普通の 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 のようなリテイン カウント メカニズムがないためです (ある時点で実装を試みましたが、完全に機能しましたが、スーパークラスとしてすべてに追加する気がしませんでした)。したがって、関数が戻った後もそれを維持するために、フープをジャンプする必要があります。

4

3 に答える 3

5

オブジェクトの代わりに、「より単純な」型を考えてください。あなたはこれをしますか:

void create() {
    int *obj1 = new int();
    int obj2;

    _obj1 = obj1;
    _obj2 = &obj2;
}

これでうまくいくと思いますか?明らかに違います。とても簡単です。スタックに割り当てられたオブジェクトへのポインターを渡すことはできません (経験則として、割り当てたばかりのオブジェクトへのポインターを渡す必要はありません。誰かがオブジェクトを割り当てた場合、その人は解放する責任があります)。それ)

于 2011-02-20T09:43:48.933 に答える
1

C++ の基本的な設計原則は、C++ を使用して高度に最適化されたコードを記述できるように、使用しないものにはお金を払わないということです。言語に関係なく、スタック割り当てはより効率的です。

于 2011-02-20T09:50:56.417 に答える
1

ヒープ オブジェクト自体は間違っていません。それらの有効期間を管理できないのは問題です。

スタック オブジェクトには、コードが関数を終了する方法 (例外、戻り値) に関係なく、デストラクタが呼び出されるというプロパティがあります。スマート ポインターはこれを利用して、ヒープに割り当てられたオブジェクトの有効期間を管理します (幸せな媒体?)

于 2011-02-20T09:47:12.130 に答える