[英]Why does this pointer contain an address stored on the heap?
這是我的代碼(在Mac OS上為g++
編譯器):
/* initialize character arrays */
char a[2] = "a";
char b[2] = "b";
/* assigns to c the pointer to a read-only buffer containing 'c' */
char* c = "c"; // does this cause a memory leak?
/* allocate heap-memory for d */
char* d = new char[2];
strcpy(d, "d");
/* print addresses and values */
std::cout << (void*)a << ":" << a << '\n';
std::cout << (void*)b << ":" << b << '\n';
std::cout << (void*)c << ":" << c << '\n';
std::cout << (void*)d << ":" << d << '\n';
/* free memory */
delete d[];
在看到該程序的輸出之前,我希望a
, b
和c
在堆棧上包含地址,在堆上包含d
地址。 但是,輸出看起來像這樣:
0x7fff5a5ea38e:a
0x7fff5a5ea38c:b
0x105616f7c:c
0x7fa01bc02690:d
由於堆棧指針從最高地址向下生長,而堆指針從最低地址向上生長,因此似乎a
, b
和d
存儲在堆棧上,而c
存儲在堆上。 是這樣嗎
我的問題是,由於我沒有使用new
關鍵字分配內存,為什么將c
存儲在堆上有意義? 這是否意味着c
初始化已造成內存泄漏? 既然我在堆上專門分配了內存,為什么將d
存儲在堆棧上?
謝謝!
您對內存區域的猜測不是很准確。 a
和b
確實存在於堆棧中,因為它們是數組。 但是, c
是指向字符串文字的指針,該字符串存儲在二進制映像(既不是堆棧也不是堆)中的.rodata
節中。 d
的值比a
和b
小380 GB(!); 它在堆上(這是一個單獨的內存區域,盡管不在任何“最低地址”處)。
請記住,除了是與語言無關的特定於平台的細節之外,諸如ASLR之類的東西也使這種觀眾運動變得困難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.