Ome*_*isk 1 c++ string memory-management
我对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;
}
Run Code Online (Sandbox Code Playgroud)
这是我在字符串中加载的地方:
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;
}
Run Code Online (Sandbox Code Playgroud)
我在"删除数据"中得到了断点和错误,这让我觉得"数据"在此之前的某个地方被删除了,但我无法找到它的位置.作为参考,该方法是以虚拟2D整数数组的形式(对于瓦片的ID)创建包含游戏的世界数据的对象.
你的问题可能在这里:
tiles[i+skip] = atoi(&tmp);
Run Code Online (Sandbox Code Playgroud)
问题1:
应该是-skip
tiles[i - skip] =
Run Code Online (Sandbox Code Playgroud)
问题2:
该atoi()命令正在使用不正确(TMP不包含的字符串).但我也不认为atoi()是合适的方法.我认为你要找的是简单的任务.从char到int的转换是自动的:
tiles[i - skip] = tmp;
Run Code Online (Sandbox Code Playgroud)
问题3:
您没有正确使用对象.在这种情况下,不需要生成动态对象并使动态内存管理变得混乱.只创建自动对象并将它们正常传回会更简单:
std::string* loadString(char* name)
// ^ Don't do this.
std::string loadString(std::string const& name)
// ^^^^^^^ return a string by value.
// The compiler will handle memory management very well.
Run Code Online (Sandbox Code Playgroud)
一般来说,你不应该传递指针.在您需要指针的少数情况下,它们应该保存在智能指针对象或容器(对于多个对象)中,以便正确控制它们的生命周期.