2011-01-04 17 views
1

std :: vector <>またはstd :: stringを使用する場合は、ヒープにも割り当てる必要があります。例:内部メモリが既にヒープに割り当てられている場合、オブジェクトのメモリをヒープに割り当てる必要がありますか?

int main() { 
    std::vector<int>* p = new std::vector<int>(); 
    delete p; 
} 

JavaおよびC#では、オブジェクトは常にこの構文を使用してヒープで割り当てられます。 C++で同じことをするのは効率的なのでしょうか?なぜなら、C++でクラスを作成するたびに、私はスタック変数とヒープ変数を合わせて使用​​するからです。たとえば、次のようにします。

class simple { 
    int a; 
    double b; 
    std::string c; 
    std::vector<int> d; 
    .... 
}; 

C++でオブジェクトを使用する場合、私はベストプラクティスを実行する必要がありますか?

  • すべてのデータはヒープに配置する必要がありますか?
  • すべてのデータが混在する可能性がありますか?
  • か...

おかげで、
チャン

+0

実際には、オブジェクトは必ずC#でその構文を使用してヒープ上にあるわけではありません。値型の場合は、スタックに移動します。 –

答えて

2

大きなサイズのオブジェクトをスタックに作成することは避けてください。ストレス(大量の入力データ)でのスタックオーバーフローがテストではほとんど見られないため、エンドユーザーがソフトウェアがクラッシュすることが不愉快になります。

文字列とベクトルと他のSTLコンテナについては、内部的に動的割り当てを使用するため、心配する必要はありません。だから答えはいいえ、それをスタックに構築するのは安全ですし、通常はそれらを動的に割り当てるのは残念です。

静的サイズの配列、boost :: arrayのような配列を囲むもの、またはデータメンバーなどのクラスは危険です。専門家は、クラスを内部的に動的にするために、しばしばpimplイディオムを使用します。

スタックは非常に高速ですが、パフォーマンスが実際に役立つところですばやく使用できます。それに注意する方が安全です。 "私はすべてをスタックに割り当てる"のような危険なイディオムを避けてください。

+0

+1安全のための良いアドバイス。私が開発した1つのプラットフォームは、新しいpthreadスレッドのデフォルトのスタックサイズを64Kに設定します。私は過去にスタックの上に大きすぎるバッファーを割り当てることで初心者の間違いを犯しました。これはあらゆる種類の変なバグが発生する原因になります。 – axw

+0

@ÖöTiib:ありがとう;) – Chan

3

は、私はこのような場合にメモリを解放を心配する必要はありませんよう、可能な限りスタック上のオブジェクトを割り当てることを試みます。明示的にオブジェクトのライフタイムを制御したいときだけ、オブジェクトをヒープに割り当てます。オブジェクトが内部的にヒープ上にメモリを割り当てても、スタック上にオブジェクト自体を作成することはできます。それには制限はありません。

1

いいえ;変数の寿命が関数の寿命を超えていない限り、スタックを使用するのが一般的です。

コンテナクラスはヒープから独自のメモリを割り当てます。スタック上の唯一のデータは、ヘッドやサイズなどへのポインタのようなコンテナクラスの必要な簿記だけです。

また、手動での新規の削除やshared_ptrなどのテクニックの使用を避けることをお勧めします。

+0

あなたの提案をありがとう! – Chan

関連する問題