我是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;
}我在"delete data;“中得到了断点和错误,这让我认为"data”在此之前被删除了,但我找不到它会在哪里被删除。作为参考,此方法创建一个对象,该对象以虚拟2D整数数组的形式(用于tiles的ID)包含游戏的世界数据。
发布于 2012-08-13 03:54:16
在您所展示的代码中,不需要动态分配字符串。将loadString函数更改为
std::string loadString(char* name)
{
ifstream in(name);
std::string input;
// ...
return input;
}在调用方中
std::string data = loadString( name );现在不需要在完成后对字符串执行delete操作。
而不是
int *tiles = NULL;
tiles = new int[data->length()-h];使用
std::vector<int> tiles;
tiles.resize(data.length() - h);此外,如果您确实需要动态分配对象,则应该使用智能指针(std::unique_ptr和std::shared_ptr),而不是原始指针。
https://stackoverflow.com/questions/11925353
复制相似问题