2011-01-07 100 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

它为什么重要?注意:堆和栈是与对象无关的实现细节(它不关心它在哪里,所以你应该)。 – 2011-01-07 14:12:11

+0

[数据成员是否可以在与C++中的对象相同的内存空间中分配?](http://stackoverflow.com/questions/187797/are-data-members-allocated-in-the-same-memory- space-as-their-objects-in-c) – 2012-07-30 20:14:36

回答

1

vector的缓冲区总是分配在堆上,但是一般来说,它的目标是被设计成 - 即时成员将被分配在同一个地方,但上帝知道嵌入式指针会指向哪里。

+0

不是100%正确。矢量存储区由分配器生成。分配器从内存中获取内存的位置是未定义的(尽管缺省内存会动态分配内存(即它具有动态存储持续时间)(尽管这不代表堆,因为这超出了C++的范围并且是实现细节))) – 2011-01-07 14:18:32

2

pTemp在堆上。 您通过值添加到矢量中,所以值被添加到矢量中,矢量本身在堆上分配存储。 情况下,当内容是在栈上是:

Class Temp 
{ 

std::vector<double *> m_dPtList; 

} 

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

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

在你的代码,Temp的只是包装std::vector。您使用new来创建Temp对象,因此它会放在堆上。该对象本身可以包含一个指向存储器的指针,在这个存储器中矢量将存储添加到其中的数据......这也将在堆上。总而言之,只有pTemp指针本身在您的堆栈上。