作者:手机用户2502895987 | 来源:互联网 | 2023-02-03 20:19
我有两个类,一个必须更改另一个类的向量的值.这是第一个要更改的向量X所在的位置:
Grid.hpp
class Grid{
public:
vector X;
}
另一个类引用了第一个类,并且有一个应该修改X的函数:
BC.hpp
class BC{
public:
Grid &grid;
BC(Grid grid);
~BC(){};
void add_to_X(int n_values);
}
BC.cpp
BC::BC(Grid grid): grid(grid){}
void BC::add_to_X(int n_values){
vector new_X;
for(int i=0; i
main.cpp中
int main(){
// grid and bc classes initialized above
bc.add_to_X(10);
}
当我运行main.cpp
上面的时候,我得到了错误malloc: *** error for object 0x7fb6294027b0: pointer being freed was not allocated
.我也试过另一个解决方案.我在类中写了一个函数grid
,它将新的X
向量从类网格本身分配给向量,但我仍然有同样的错误.如果我注释掉该行,grid.X = new_X;
则错误消失.上面的代码有什么问题?什么是正确的编码方式?
1> ComicSansMS..:
问题是这一行:
BC::BC(Grid grid): grid(grid){}
这样做,它将传递给构造函数的参数复制到临时grid
.然后,将成员变量(引用)指定为指向此临时变量.但是,一旦构造函数退出,该临时文件将再次被销毁,因此您的引用将保持悬空状态.
所以你要么必须让它一直向下引用:
BC::BC(Grid& grid): grid(grid){}
然后确保调用者使相应的Grid
对象保持活动状态,或者让BC
商店获得副本Grid
而不仅仅是引用.
正如评论中所建议的那样,您应该利用这个机会来提高您的调试技巧.崩溃发生时,您的悬空引用将指向无效对象.悬空引用很难自动检测,因此了解调试器中的问题是很有用的.在修复之前,通过分析调试器中的问题,查看是否可以找出出错的地方.