【发布时间】:2012-08-12 19:47:36
【问题描述】:
我对 C++ 内存管理比较陌生,我遇到了这个奇怪的堆损坏错误(加上之前 Visual Studio 中的自动断点)。这是有问题的代码:
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 整数数组的形式包含游戏的世界数据(用于图块的 ID)。
【问题讨论】:
-
你最好只按值返回一个字符串而忘记内存管理。
-
你确定是
tiles[i+skip]而不是tiles[i-skip]? -
数据不会在其他任何地方被删除 - 但它可能会损坏,因为例如您正在写入超出切片数组的范围。 2 个修复:1) 不使用原始指针,但使用智能指针或按值传递 std::string 2) 使用 std::vector
而不是原始数组
标签: c++ string memory-management