2010-10-18 35 views
2

我正在使用fread在C++中讀取字符串,其中我正在閱讀並將shortSiteText存儲在siteNames_中。 siteNames_被聲明爲std::vector<char*> siteNames_;我在其他函數中使用siteNames_,但因爲shortSiteText是一個指針,所以當我調用它的delete命令時,siteNames_中的最後一項被改變。我如何防止這種情況?防止char *向量中的最後一個元素髮生變化

for (unsigned int i = 0; i <= nSites; i ++){ 
    fread((char *) &shortSiteTextLength, 1, sizeof shortSiteTextLength, baseFile_); 
    shortSiteText = new char[shortSiteTextLength]; 
    fread(shortSiteText,1, shortSiteTextLength,baseFile_); 
    siteNames_.push_back(shortSiteText); 
} 
delete [] shortSiteText; 

我試圖使用引用操作:siteNames_.push_back(*shortSiteText);但生成編譯器錯誤。

注意:由於遺留代碼,我必須使用fread和char *。

+2

爲什麼不使用'std :: string'?任何時候,如果你在你的代碼中有'delete',很可能會改進一些東西。 – GManNickG 2010-10-18 21:03:42

+0

@GMan,我在別處使用遺留代碼 – Elpezmuerto 2010-10-18 21:04:12

+4

這就是'c_str' /'data' /'&s [0]'的用途。如果這不適合你,請改用'std :: vector '和'&v [0]'。 **你不應該手動刪除一些東西。**你的整個問題是因爲所有權不明確,因爲你試圖把它交到你自己的手中。這是不安全和錯誤纏身。 – GManNickG 2010-10-18 21:05:26

回答

2

讓我們對這個變焦:

shortSiteText = new char[shortSiteTextLength]; 
siteNames_.push_back(shortSiteText); 
delete [] shortSiteText; 

說明:第二行只是一個推指向數組,而不是數組本身。第一行然後取消分配數組,siteNames的最後一個元素仍然指向該數組;當你使用這個元素時會導致未定義的行爲。

哈克:刪除delete [] shortSiteText

真正的解決:因爲你嘗試管理對象的所有權自己遇到這種問題。別 !在這裏,您可以使用std::string,並且仍然可以使用遺留代碼和c_str()成員函數。

引述我的一個朋友:

作爲一般規則,如果你是一個初學者 和你的代碼包含 單詞「字符」,你有一個錯誤。

+0

我同意那句話,我多少被迫使用char,並且對此不滿意。我希望避免在沒有嚴肅的代碼檢修的情況下破解解決方案,似乎我無法做到這一點 – Elpezmuerto 2010-10-18 21:23:32

+0

@Elpezmuerto:你甚至讀過我的評論嗎?你*不需要*需要手動分配char的。 – GManNickG 2010-10-19 18:07:54

3

您不能delete[]任何東西,你推入vector,直到關聯的vector元素完成。

我不清楚這個代碼的意圖是什麼 - 你只是刪除shortSitetext最後使用的值,所以這不符合你的想法(它試圖通過匹配new來避免內存泄漏delete,我認爲)。

刪除代碼的最後一行,並手動清理vector當你被遍歷調用delete[]每個元素,那麼clear()vector用它做。

或使用boost::ptr_vector,這將自動爲您做到這一點。

或使用vector<string>,使用C++世界將遺留的char*代碼從您現代的非原始指針中分離出來。您可以直接的push_back const char*vector<string>像這樣:

const char* str; 
// init str to the value you wish 

vector<string> vec; 
vec.push_back(str); 
0

,直到你想從矢量刪除數據不刪除shortSiteText。

您已經創建了一塊內存,設置了數據並將指針保存在向量中。您刪除的內存與向量元素指向的內存相同。

剛剛刪除了delete [] shortSiteText;一行。

但是,請確保當您完成向量時,要仔細刪除和刪除每個指針。

相關問題