2017-09-15 42 views
0

我有一些代碼片斷低於可以解決一個靜態變量的值與堆分配地址匹配嗎?

static const int s_kVar1 = 0; 
static const int s_kVar2 = 1; 

... 

void foo() 
{ 
    MyObject *o = new MyObject(); 
    // Is it ever possible that (o == &s_kVar1) or (o == &s_kVar2) 
} 
+3

你的問題似乎問'o ==&s_kVar1',但代碼詢問'&o ==&s_kVar1'。 – chris

+0

您的語法對'o'無效,因爲堆需要一個指針。 –

+0

你有沒有遇到過讓你相信這個或者是純粹假設的東西? – molbdnilo

回答

1

簡短的回答是否定的。不同的對象保證有不同的地址。全局(s_kVar)和動態分配的對象(o)進入不同的內存區域。

P.S.但是,是的,你可以濫用語言來打破這種保證。您可以在同一個內存位置構造兩個不同的對象。

+0

工會存在時,這不是真的濫用。 –

+0

@MadPhysicist一次只有一個工會會員可以活躍。 – Quentin

+0

@Quentin。出於同樣的原因,只有一個對象可以在給定的時間真正地打破給定的內存位置。這並不影響我的讚賞。 –

0

否。靜態變量存儲在.BSS或.DATA段中,具體取決於它們是初始化還是未初始化(0初始化)。在你的情況下,

static const int s_kVar1 = 0;將進入.BSS和
static const int s_kVar2 = 1;將進入.DATA

堆用於動態分配。

順便說一句我不明白爲什麼你在文件範圍使用靜態常量。 const默認進行內部連接,全局變量具有靜態生命週期。除非你使用C,我可以看到它很有用。