只想知道資料成員在記憶體中的位置,堆還是堆疊。 下面是我的代碼:
#include <iostream>
#define p(s) std::cout << s << std::endl
class Fook
{
public:
char c = 'c'; /
Fook() {
p(c)。
}
};
class IDK
{
public:
int* arr = new int[1]; //
IDK() {
Fook fook3; /
arr[0] = 90;
Fook* fook4 = new Fook(); /
p(arr[0]) 。
}
};
int main(int argc, char const *argv[])
{
福克fook1。
Fook* fook2 = new Fook()。
IDK idk1;
IDK* idk2 = new IDK() 。
return 0;
編譯并給出了預期的輸出
c
c
c
c
90
c
c
90
在上面的代碼示例中,obj *fook2和*idk2被分配在heap mem上,fook1和idk1被分配在stack mem上。
- 是
fook2->c在堆疊mem上(obj在heap mem上) - 是
*arr在idk1上的堆記憶體(obj在堆記憶體上) - 是
*arr在idk2上的堆記憶體 。
- 是
*fook4在ctor的idk1的堆mem 。
- 是
fook3在ctor的idk2的堆mem上 。
- 是
*fook4在ctor的idk2的堆mem上 。
總結一下所有的事情,
在int main(int argc, char const *argv[])中創建的每個物件的資料成員在記憶體(堆疊或堆)中的什么位置
uj5u.com熱心網友回復:
首先:堆疊和堆不是C 語言的概念,而是實作的概念。C 標準談論的是自動和動態存盤。但是為了簡單起見,我們只談堆疊和堆。
通常情況下,new運算子將把你的物件放在堆中(除非new運算子被多載)。否則,你的物件就會進入堆疊。
是 fook2->c在堆疊記憶體上(obj在堆記憶體上)
c的部分將在Fook物件所在的地方。在fook2的情況下,它是堆。注意這個微妙之處。你說fook2->c是箭頭運算子:它實際上是加載c(除非多載)。所以結果會落在fook2->c左邊的地方。
- 是
*arr中的idk1在堆記憶體上(obj在堆記憶體上)
再次。arr在IDK物件上的欄位在該物件所在的地方。在idk1的例子中,我們有arr指標住在堆疊上。然而,它所指向的東西,即*arr,是在堆上(因為new被使用)。這里也有一個微妙的問題。*運算子實際上是將資料加載到左邊的地方(再次:除非多載)。
- 在
。idk2中的*arr是在堆記憶體中
idk2住在堆上,因此arr指標住在堆上。此外,*arr也在堆上,因為它是通過new運算子宣告的。
- ?
*fook4是否在ctor的idk1的堆m上
fook4 指標住在堆疊上。它所指向的資料住在堆上。
fook4指標住在堆上。
- 是
。fook3在ctor的idk2堆上
fook3物件住在堆疊上。總是這樣。在new初始化堆物件idk2時呼叫構造器并不重要。建構式只是一個函式,有點特殊,但與其他函式并沒有什么不同。建構式甚至不知道它是在堆物件還是堆疊物件上被呼叫的,而且它也不在乎。
- 是
。*fook4在ctor的idk2上的堆m
與(3)和(4)類似,fook4指標住在堆疊中,而它所指向的資料(即*fook4)住在堆中。
uj5u.com熱心網友回復:
基本上
fook1: 完全在堆疊中。fook2: 完全在堆中。idk1:int*成員將在堆疊中,而它指向的一個元素陣列將在堆中。idk2:int*將在堆上,它所指向的陣列也將在堆上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/329130.html
標籤:
