我有以下链表结构
struct MyClass {
int i;
string str;
uint64_t address;
};
主要是
int main () {
MyClass * pt;
pt = new MyClass;
pt->i = 10;
pt->str = "test";
pt->address = 2343233233;
delete pt;
return 0;
}
问题是,删除pt后,这是我得到的结果。
i = 323322;
str = "";
address = 2343233233;
变量i有垃圾值,str为空且地址保持不变。有人知道为什么会这样,怎么解决?提前谢谢。
答案 0 :(得分:3)
没有解决这个问题,因为没有错误(*)。
您为类的实例分配一块内存,在那里设置一些值,然后释放该内存。
调用delete pt;
后,指针pt
指向的地址不再用于您,写入甚至从那里读取可能会导致未定义的行为。理论上,该程序可以发送忍者来杀死你。在实践中,大多数情况下,您只是访问相同的内存位置,只有使用它才会导致灾难性故障。
您看到的内容最有可能是内存分配器在释放后执行的内部记录更改。
最后一点:我真的不知道你在哪里见过这个,但是你的班级绝对不是你应该如何实现一个链表:
struct listnode {
// some data
listnode * next;
// better: std::unique_ptr<listnode> next;
// or with sharing: std::shared_ptr<listnode> next;
};
指针的原因。
(*)澄清:没有错误,因为程序显示了一种未定义的行为形式,这正是它应该以这种形式做的事情(删除后解除引用) )。