修改另一个类的向量成员时出错
Error when modifying vector member of another class
我有两个类,一个必须改变另一个类的向量的值。 这是第一个,其中要更改的向量 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);
}
公元前
.cppBC::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
的副本,而不仅仅是引用。
正如评论中所建议的,您应该利用这个机会来提高您的调试技能。发生崩溃时,悬空引用将指向无效对象。悬空引用很难自动检测,因此了解调试器中的此类问题非常有用。在修复问题之前,查看是否可以通过在调试器中分析问题来跟踪问题所在。
相关文章:
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在 Clang 中使用指向成员的指针时出错
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- 通过多个类访问成员时出错
- 将私有数据成员作为默认参数传递给该类的公共方法时出错
- 类和成员函数模板专用化出错
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 编译特征程序时出错:错误:'seq'不是'Eigen'的成员
- 调用指向成员函数的指针时出错
- 修改另一个类的向量成员时出错
- 向模板化静态成员初始化添加和不添加'typename'都会出错
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 推导成员函数包装器的返回类型时出错
- 编译类模板成员函数时出错
- 在 C++ 中访问泛型结构的成员会出错
- 初始化作为结构成员的函数指针时出错
- 类中的const成员出错