2016-02-23 35 views
1

我一直試圖讓這段代碼工作很長一段時間,不幸的是,我總是得到NullReferenceException。我發現,如果不使用指向類的指針,這段代碼就可以工作,但我不明白爲什麼指針可能會導致此異常。順便說一下,我對C++並不是很有經驗,所以你可以用簡單的方式來解釋它。提前致謝。爲什麼分配成員會引發NullReferenceException?

class Box 
{ 
    public: char* data; 
}; 
int Main() 
{ 
    Box* a; 
    a->data = "Hello World"; 
    return 0; 
} 

回答

2

Box* a;聲明一個指針Box對象。你永遠不會創建 a Box對象,所以a不指向任何東西。

因此寫作a->data的行爲是undefined

要麼丟指針,所以你得到Box a;,或使用Box* a = new Box();。在後一種情況下,別忘了打電話給delete a;,否則你會泄漏記憶。

最後,編寫a->data = "Hello World";可能會產生問題:a->data然後將指向只讀字符串文字;嘗試修改該緩衝區內容的行爲是undefined

使用std::string作爲a的類型要好得多。

+0

感謝您幫助我解決問題,但是您是否也可以寫出如何正確編寫「a-> data」? –

+0

我會安排一些東西,這樣'Box'的* constructor *將'const std :: string&'帶到你想要設置的數據,並且將'a'成員賦值給那個構造函數參數。 – Bathsheba

0

a未初始化(或分配),它只是一個懸掛的指針。任何解除引用將是Undefined behavior

您可以Box* a = new BoxBox b; Box* a = &b使指針有效。例如

Box* a = new Box; 
a->data = "Hello World"; 
... 
delete a; 
+0

這裏沒有理由使用'new'。現在OP會認爲所有的指針都需要被新增。 – juanchopanza

+0

@juanchopanza我剛剛回答OP的問題。是的,如果你想通過像這樣的指針訪問成員,它需要被新的。 – songyuanyao

+0

不,新'和動態分配是使用指針的完全獨立的問題。難怪人們對此感到困惑,並帶有這樣的答案。所有需要的是'a'指向一個'Box'對象。而已。 – juanchopanza

1

指針Box對象是一個Box對象。指針Box* a指向一個不存在的對象,這就是爲什麼當您嘗試將「Hello World」指定給成員時出現錯誤。

Box a; 

或通過用動態存儲持續時間「在堆上」創造它:

您應或者通過與自動存儲持續時間「在棧上」創造它創建一個Box對象

Box* a = new Box; 

使用後刪除它:

delete a; 
1

一個指針指向一個(希望)分配的內存塊。在你的例子中,指針是未初始化的,所以你試圖設置你無法訪問的內存。

你應該確保它指向有效的東西,像這樣:

int Main() 
{ 
    Box box; // stack allocation 
    Box* a = &box; // you could also call new Box; here 
    a->data = "Hello World"; 
    return 0; 
} 
1

a的價值是不確定的,因爲你永遠不將其設置爲任何東西。因此,任何事情都會發生。最有可能的是你訪問不屬於你的內存,觸發分段錯誤或類似的訪問異常。這是發生了什麼事。

不要這樣做。根據已定義的相同類型的變量的地址來定義您的地址。

相關問題