当我调用对象的方法时,对象的成员会发生变化
My objects' members change when I call their methods
我在C++中有一个对象,其中有几个属性最初设置为nullptr
,这个想法是我可以判断何时到达我迄今为止定义的边缘。例如,我可以将Node
链接在一起链接到一个链表中,并通过与nullptr
进行比较来检测列表的末尾:
class Node{
public:
Node* next;
bool val;
Node(bool v){val=v; next=nullptr;}
void append(bool v){
if (next==nullptr){
next=&Node(v);
}else{
next->append(v);
}
}
}
问题是我不断收到读取访问违规。当我在 Visual Studio 中逐行执行时,我在每次失败之前都会看到同样的事情:在一个堆栈帧中,next
设置正确,0x00000000用于自己的后继帧,但是当我调用next->append(v);
时,突然next
是一个随机指针,如 0x01010101 或 0x00000001,它不是nullptr
,因此代码尝试在其上调用append
并死亡,因为该地址没有Node
. 回顾一下:*next.next==nullptr
,但是在打电话next.append(v);
之后,有些事情发生了变化并next!=nullptr
了。
这里的解决方案是动态分配该对象。您正在使用的临时值超出了下一行的范围,并且对该行的任何引用都将失效,这意味着您的next
指针现在是垃圾。
简单的解决方法是:
void append(bool v) {
if (next == nullptr) {
next = new Node(v);
} else {
next->append(v);
}
}
使用new
进行分配并适当放置该值的地方。
请务必注意,当您分配new
时,您的代码负责释放带有delete
的内存。换句话说,您现在有义务创建一个析构函数来解除所有分配。
值得注意的是,您的构造函数没有正确表达,它应该如下所示:
Node(bool v) : val(v), next(nullptr) { }
其中使用构造函数列表。这可确保不会首先默认值,然后通过有效地重新定义默认值来立即分配值。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 当我调用对象的方法时,对象的成员会发生变化
- MATLAB:跟踪imufilter对象中的状态变化
- 当对象传递给成员函数时,成员函数的行为会发生变化?
- C++不认识我在对象.cpp的变化
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 如何根据父对象的相对变化计算子对象的新全局位置
- 在X个对象之间跟踪一个对象中的变量变化
- 拍摄图像时亮度是否变化,请更改图像中的对象大小
- 如何处理类结构的变化,并与使用 boost 序列化的数据/对象向后兼容
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- 在c++中,对象可以警告类它已经发生了变化吗?
- 存储和检索unordered_map后对象的变化
- 作用于可移动但不可复制对象序列的变化STL算法的行为