可能重複:
Does this type of memory get allocated on the heap or the stack?內存管理,協議棧和堆問題
我有一些記憶有關的問題,我希望你們會能夠回答。考慮以下代碼,以富表示,有很多原始數據成員的方法和大量的一大類:
class Foo {
public:
Foo() : // Initialize all data members ...
{ }
// Lots of methods ...
~Foo() { /*Nothing needed here ... correct?*/ }
private:
int a;
int b;
char c;
double d;
// Lots of other primitive data members (no pointers) ...
};
class Bar {
public:
void func() {
foo = new Foo();
}
// Assuming Bar::func() is always called before deletion ...
~Bar() { delete foo; }
private:
Foo* foo;
};
int main() {
Bar bar;
bar.func();
Bar* barptr;
barptr->func();
return 0;
}
我的問題是,當我打電話bar.func()
,都在分配的Foo
所有的數據成員棧內存或堆內存(我知道foo
會堆在...我想!)?當我打電話給barptr->func()
時呢?例如,Foo::a
在堆棧上還是在堆上?
此外,我是否需要明確刪除Foo::~Foo()
中的任何內容? Foo只有原始本地數據成員,並且沒有任何功能使用new
或malloc()
。
在我完全不知道我在說什麼的情況下,如果有人能夠解釋這些數據的存儲位置,我將不勝感激。
@sehe:我懷疑它是微軟文本表示的產物。 – wallyk
另請參見:http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization描述了爲什麼當C++完成正確時,析構函數通常是空的。 –
@sehe:你確定嗎?這種現象不會發生在我的基於Linux的瀏覽器的複製和粘貼操作上,但偶爾會發生在Windows上。不知道爲什麼它每次都沒有發生 - 也許有一些內部的黑客來解決它。 – wallyk