2010-11-15 81 views
1

我是C/CPP應用程序的新手,並用一段C/CPP代碼分析問題。我遇到了Segmentation Fault(分段錯誤)錯誤,我不是要確定分段錯誤的根本原因。C++的核心轉儲分段錯誤

請看以下情形:

union Value {

 
    int value_int; 
    float value_float; 
    RWCString *value_string; 

}

 
void setValueString(const RWCString &value_string_arg) 
{ 
    *(value.value_string) = value_string_arg; //value is a reference to UNION Value. 
} 
當應用程序利用這一段代碼的

,那麼它在產生分割故障運行時並終止。我放了幾個控制檯輸出語句,並明白分段錯誤可能是由於

 
    *(value.value_string) = value_string_arg; 

行。

任何人都可以請驗證我的分段錯誤的識別?另外,我不太確定如何解決這個問題。請讓我知道,如果有人有同樣的想法。

任何幫助,非常感謝。由於

〜Jegan

+1

您將需要找到RWCString的定義,因爲這不是常見的字符串類型,並且C/CPP也不存在。你正在用C++編寫。 – Puppy 2010-11-15 20:40:46

+0

僅供參考,'RWCString'恰好是來自Rogue Wave C++庫的通用字符串類型。 – 2010-11-15 20:41:50

+0

你知道如何使用gdb嗎? – anijhaw 2010-11-15 20:45:25

回答

3

你可能想這樣做:

value.value_string = new RWCString(value_string_arg); 

在你的代碼,如果value.value_string是一個未初始化的指針,那麼你就分配將嘗試寫入內存的一些隨機的部分,導致分割值。在我上面的代碼中,new運算符爲RWCString分配一個新的內存塊,並調用複製構造函數來複制value_string_arg。然後它將指向新分配的內存塊的指針分配給value.value_string

不要忘了delete value.value_string當你完成它,以避免內存泄漏!

2

當你做*(value.value_string),你是提領指針,即你問的編譯器設置的事物的價值由value.value_string指向。你需要確保它指向一段有效的內存。如果你不這樣做,那麼當你分配給它時,你最終會寫入內存中的一個隨機位置,從而導致分段錯誤。

在C++中,您通常會事先得到一個有效的內存塊,例如value.value_string = new RWCString;(並確保您完成時您的delete)。但是,這是很危險的在你的情況下,因爲你已經創建了指針的聯合。只要你寫信給value.value_float,您將失去指針值,並且您將有內存泄漏。

2

嘗試使用gdb分析核心轉儲。核心轉儲應該能夠確切顯示seg故障發生的位置。您將需要編譯啓用調試。

0

(您使用的語言是C++,而不是C/CPP或C/C++。)

主要問題在這裏:您正在使用union。初學者可能不應該使用union s,因爲如果初始化一個成員,然後嘗試使用另一個成員,則會炸燬。

所以假裝沒有union,你真的有一個RWCString*指針:你確定它指向一個有效的對象嗎? RWCString什麼時候建成,它的壽命是多少?

當然,分段錯誤並不總是發生在無效代碼上。在此之前,你可能會發生其他不好的事情,然後再咬你。