我对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