2015-01-21 49 views
0

的malloc分配這是從我的問題跟進:Array of strings with malloc on C++刪除STD數組::串與C++

正如我已實施貝d的解決方案,我已分配的內存爲std::string的陣列malloc然後根據與new創建的std:string的元件中的每一個:

void* TP = malloc(sizeof (string) * SS); 
for (int i = 0; i < SS; i++) { 
    new (&((string*)TP)[i]) std::string(Token[i]); 
} 

Tokenvector<string>SS一個int

我知道這是不推薦的,我知道這是不優雅,我知道有 對於該陣列的創建和灌裝許多其他解決方案,但我需要做 這種方式

的我現在遇到的問題是在數組刪除。當我單獨創建各std::string但對於一個malloc陣列配置,在我的析構函數中我已經寫:

for (int i = 0; i < SS; i++) { 
    delete (&((string*) TP)[i]); 
} 
free(TP); 

但運行時,free(TP)指責「雙自由或腐敗」。

通過評論free(TP)我解決了運行時問題(隱藏真正的問題),但我需要確保釋放所有內存,因爲這可能會導致類內存泄漏。

那麼,刪除TP中的每個元素足以釋放所有內存?根據我的理解,malloc已獨立分配內存,並且需要獨立於std::string元素,但那麼,爲什麼我會得到這個錯誤?

+2

不要直接使用任何'new'或'malloc'或類似的東西。使用RAII設施! – 2015-01-21 01:14:08

+1

「通過評論免費(TP)我解決了這個問題」......不,那隱藏了問題。這並不能解決問題。 – 2015-01-21 01:21:20

回答

6

你做一個佈局,新的運行malloc分配塊std::string的構造,但此時你使用delete將運行析構函數,並嘗試釋放內存(你不想做第二個在這裏,因爲你解放了free())。

你想手動運行析構函數,像這樣......

for (int i = 0; i < SS; i++) { 
    (&((string*) TP)[i])->~string(); 
} 
free(TP); 
+2

換句話說,「放置新」的匹配操作是「調用析構函數」。 – 2015-01-21 01:22:30

+0

'string * sp =(string *)TP; for(int i = 0; i 〜string();'更簡單。 – 2015-01-21 01:22:53

+0

嗨尼克,它工作完美。當我刪除數組的第一個元素時,我曾經有過這樣的印象:你對這個std :: classes的構造函數/析構函數不熟悉。 – 2015-01-21 01:27:12

1

首先,讓我們來收拾你的代碼。我建議你遠離void*陣列類型。然後,你可以做到這一點,這是一個小更易於閱讀,特別是在new()操作:

std::string* TP = (std::string*) malloc(sizeof (std::string) * SS); 
for (int i = 0; i < SS; i++) { 
    new (&TP[i]) std::string(Token[i]); 
} 

現在,以釋放字符串,你必須直接調用析構函數的,不使用delete(有沒有投放刪除運營商,像你這樣假設):

for (int i = 0; i < SS; i++) { 
    TP[i].~string(); 
} 
free(TP); 

現在,這麼說,你顯然有機會獲得std::vector,所以沒有什麼理由使用malloc()代替:

std::vector<std::string> TP(SS); 
for (int i = 0; i < SS; i++) { 
    TP[i] = Token[i]; 
} 

或者:

std::vector<std::string> TP; 
TP.reserve(SS); 
for (int i = 0; i < SS; i++) { 
    TP.push_back(Token[i]); 
} 

或者:

std::vector<std::string> TP(Token.begin(), Token.begin()+SS);