2011-01-07 18 views
0

クラスオブジェクトをヒープに割り当てているので、すべてのデータメンバーがヒープになります。しかし、私のクラスはメンバーとして、いくつかのデータ構造(例えばstd::vector)が含まれてどのような場合:ヒープ割り当てオブジェクトのデータメンバーは、ヒープまたはスタックに割り当てられますか?

#include <vector> 

class Temp 
{ 
public: 
    std::vector<double> m_dPtList; 
}; 

int main() 
{ 
    Temp* pTemp = new Temp; 
    pTemp->m_dPtList.Add(10.0); 
    pTemp->m_dPtList.Add(20.0); 
    pTemp->m_dPtList.Add(30.0); 

    return 0; 
} 

値は10.020.0、および30.0はヒープ上またはスタック上に保存されますか?

+0

なぜ重要ですか?注:ヒープとスタックは、オブジェクトに関係のない実装の詳細です(なぜそれがどこにあるかは関係ありません)。 –

+0

可能な複製[データメンバーはC++のオブジェクトと同じメモリ空間に割り当てられていますか?](http://stackoverflow.com/questions/187797/are-data-members-allocated-in-the-same-memory- space-as-their-objects-in-c) –

答えて

1

vectorのバッファは常にヒープ上に割り当てられますが、一般的にはオブジェクトが設計されています - 即時のメンバは同じ場所に割り当てられますが、埋め込まれたポインタがどこを指すのかは神が知っています。

+0

100%ではありません。ベクトル記憶領域は、アロケータによって生成される。アロケータがメモリを取得する場所は未定義です(ただし、デフォルトのメモリはダイナミックストレージの持続時間ですが(ヒープという意味ではありませんが、C++の範囲を超えて実装されています))) –

+0

申し訳ありませんが、allocatorパラメータは忘れています。修正をありがとう! – Mehrdad

2

pTempはヒープ上にあります。 値をベクトルに加算すると、値がベクトルに追加されます。ベクトル自体はヒープ上の記憶域を割り当てます。内容はスタックになり ケースがある:あなたのコードで

Class Temp 
{ 

std::vector<double *> m_dPtList; 

} 

double temp = 10.0; 
Temp* pTemp = new Temp(); 

pTemp->m_dPtList.Add (&temp); 
+0

その場合、ベクトルの内容はヒープ上の 'double *'ですが、スタック上の値を指しています.... –

+0

'pTemp'はヒープ上にありません。それが指すオブジェクトはです。 'pTemp'自体は自動であり、スタック上にあります。 –

0

Temp年代はちょうどstd::vectorを包みます。 tempオブジェクトを作成するにはnewを使用し、ヒープ上に移動します。そのオブジェクト自体は、ベクトルがそれに追加されたデータを格納するメモリへのポインタを含むことが期待できます...それはまたヒープにもあります。要約すると、pTempポインタだけがスタックにあります。

関連する問題