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

Error when modifying vector member of another class

本文关键字:成员 出错 向量 另一个 修改      更新时间:2023-10-16

我有两个类,一个必须改变另一个类的向量的值。 这是第一个,其中要更改的向量 X 位于:

网格.hpp

class Grid{
public:
vector<double> X;
}

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

BC.hpp

class BC{
public:
Grid &grid;
BC(Grid grid);
~BC(){};
void add_to_X(int n_values);
}

公元前

.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;

主.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;错误就会消失。 上面的代码有什么问题?正确的编码方法是什么?

问题是这一行:

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

这样做的作用是,它将您传递给构造函数的参数复制到临时grid中。然后,分配成员变量(引用)以指向此临时变量。但是,一旦构造函数退出,该临时函数就会再次被销毁,因此您的引用将悬而未决。

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

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

然后确保调用方使相应的Grid对象保持活动状态,或者让BC存储Grid的副本,而不仅仅是引用。

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