【发布时间】:2011-11-06 08:24:56
【问题描述】:
我为一个名为 copy() 的对象创建了一个函数,它应该只返回一个具有所有相同值的对象实例 -
Grid Grid::copy() {
Grid result;
result.setFilename(f_name);
result.setNumOfRows(num_rows);
result.setNumOfCols(num_cols);
result.setMap(map);
return result;
}
我的析构函数看起来像这样 -
Grid::~Grid() {
for(int r=0;r<num_rows;r++)
delete [] map[r];
}
现在每当我的代码运行并调用复制函数时,我都会收到一个错误
*** glibc detected *** ./go: double free or corruption (!prev): 0x0982c6a8 ***
在那之后还有很多其他信息(大墙的文字)。那只是意味着内存被删除了两次对吗?如果是这样,这怎么可能?为什么析构函数会被调用两次?
调用它的代码如下所示 -
for(;;) {
Grid g;
if(which_display == 1) {
.....
.....
g = myServer->getAgent()->getGrid()->copy(); //HERE
}
//print
std::cout<<g.toString();
}
我觉得我错过了一些明显的东西。有人可以向我指出析构函数是如何被调用两次的吗?
【问题讨论】:
-
需要更多代码才能确定,但您的
setMap调用似乎正在对它所拥有的一些内存进行浅拷贝。 -
在您的
result.setMap(map)中,它是否对map进行了深层复制?如果没有,那么你的问题就在那里。换句话说,Chad 所说的 (+1)。 -
我需要看看你的 setMap() fn。
-
什么是
map,为什么不使用资源管理智能指针? -
顺便说一句:这看起来像是将 Java 翻译成 C++。您通常不需要在 C++ 中编写 copy() 方法 - 您只需编写一个复制构造函数,然后在实例上使用赋值运算符,例如。网格 g = *(myServer->getAgent()->getGrid());