修改另一个类的矢量成员时出错

Mat*_*ani 1 c++ vector

我有两个类,一个必须更改另一个类的向量的值.这是第一个要更改的向量X所在的位置:

Grid.hpp

class Grid{
  public:
    vector<double> X;
}
Run Code Online (Sandbox Code Playgroud)

另一个类引用了第一个类,并且有一个应该修改X的函数:

BC.hpp

class BC{

  public:

  Grid &grid;
  BC(Grid grid);
  ~BC(){};
  void add_to_X(int n_values);
}
Run Code Online (Sandbox Code Playgroud)

BC.cpp

BC::BC(Grid grid): grid(grid){}

void BC::add_to_X(int n_values){
  vector<double> new_X;
  for(int i=0; i<n_values; i++){
    new_X.push_back(0.1);
  }
  grid.X = new_X;
Run Code Online (Sandbox Code Playgroud)

main.cpp中

int main(){
// grid and bc classes initialized above
bc.add_to_X(10);
}
Run Code Online (Sandbox Code Playgroud)

当我运行main.cpp上面的时候,我得到了错误malloc: *** error for object 0x7fb6294027b0: pointer being freed was not allocated.我也试过另一个解决方案.我在类中写了一个函数grid,它将新的X向量从类网格本身分配给向量,但我仍然有同样的错误.如果我注释掉该行,grid.X = new_X;则错误消失.上面的代码有什么问题?什么是正确的编码方式?

Com*_*sMS 5

问题是这一行:

BC::BC(Grid grid): grid(grid){}
Run Code Online (Sandbox Code Playgroud)

这样做,它将传递给构造函数的参数复制到临时grid.然后,将成员变量(引用)指定为指向此临时变量.但是,一旦构造函数退出,该临时文件将再次被销毁,因此您的引用将保持悬空状态.

所以你要么必须让它一直向下引用:

BC::BC(Grid& grid): grid(grid){}
Run Code Online (Sandbox Code Playgroud)

然后确保调用者使相应的Grid对象保持活动状态,或者让BC商店获得副本Grid而不仅仅是引用.

正如评论中建议的那样,您应该利用这个机会来提高您的调试技巧.崩溃发生时,您的悬空引用将指向无效对象.悬空引用很难自动检测,因此了解调试器中的问题是很有用的.在修复之前,通过分析调试器中的问题,查看是否可以找出出错的地方.