我對C++內存管理比較陌生,而且我得到了這個堆損壞的奇怪錯誤(以及之前的Visual Studio自動斷點)。這是有問題的代碼:C++ - 刪除std :: string *;堆腐敗
z_world::z_world(char* name)
{
unsigned int i, skip;
char tmp;
//Load data from file
std::string* data = loadString(name);
//Base case if there is no world data
tiles = NULL;
w = 0;
h = 0;
if(data->length() > 0) {
//Set up the 'tiles' array
for(i = 0; i < data->length(); i++) {
if(data->at(i) == '\n')
h++;
if(h == 0)
w++;
}
tiles = new int[data->length()-h];
//Load Data
skip = 0;
for(i = 0; i < data->length(); i++) {
if(data->at(i) == '\n') {
skip++;
printf("\n");
continue;
}
tmp = data->at(i);
tiles[i+skip] = atoi(&tmp);
printf("%i ",tiles[i+skip]);
}
}
delete data;
}
此處,我在字符串中加載:
std::string* loadString(char* name)
{
ifstream in(name);
std::string* input = new string();
while(in) {
std::string line;
getline(in,line);
input->append(line);
input->append("\n");
}
in.close();
return input;
}
我得到的內部斷點和錯誤「刪除數據;」,這讓我覺得「數據」在此之前的某個地方被刪除,但我找不到它會在哪裏。作爲參考,這種方法是創建一個包含遊戲世界數據的對象,其形式爲虛擬2D整數數組(用於tile的ID)。
你會更好的只是返回一個字符串的價值和忘記所有關於內存管理。 – juanchopanza 2012-08-12 19:50:11
你確定它是'tiles [i + skip]'而不是'tiles [i-skip]'嗎? – kennytm 2012-08-12 19:51:09
其他地方的數據不會被刪除 - 但它可能會被破壞,因爲您正在寫入超出tiles數組的範圍。 2修正:1)不要使用原始指針,但智能指針或通過值傳遞std :: string 2)使用std :: vector < int >而不是原始數組 – stijn 2012-08-12 19:52:16