1
17
如果正在调用节点析构函数,则它已经处于删除过程中。因此,删除在节点析构函数中没有意义。
相反,您应该获得temp->将next()转换为临时变量。否则,您将访问已删除的内存。 更像这样:
|
2
4
不,你不应该
|
3
4
目前,您的代码会导致访问冲突,因为以下第二行显然会访问已释放的内存:
|
4
2
在做其他事情之前:我真的,真的希望这是分配给你们的家庭作业,以便理解一个双链表。否则,就没有理由用它来代替
不
请注意,可以通过删除节点的dtor中的下一个节点来解决这两个问题:
这样,您的列表dtor也变得非常简单:
对我来说,这似乎是DTR发明的目的,所以,除了现在没有人应该再编写自己的链表类型之外,对我来说这似乎是 C++解决方案 解决你的问题。 |
5
1
|
6
0
上面的代码将调用Node::~Node()两次。(在“删除临时”和节点::~Node()中) Node::~Node()不应调用“delete this”(否则程序将崩溃) 另外,代码中的while循环将不起作用。它将取消对无效指针的引用。 |
7
0
一般来说,析构函数应该只考虑删除(或释放,如果使用C或malloc)专门为对象分配的任何内存。删除指向对象的指针将始终由操作系统管理,您不必担心该部分的任何问题。 值得记住的一点是,在构造时,首先创建对象(当控制流进入构造函数的主体时),然后再创建其中的对象;对于销毁,您必须反向执行,因为如果您首先删除外部对象,您将无法访问内部指针来删除这些对象。相反,您可以使用析构函数删除内部对象,然后当控制流脱离析构函数时,操作系统管理内存的实际释放。 顺便说一句,子类化也会发生同样的事情——如果你有类A,类B:public A,那么当你做一个新的B()时,A构造函数首先执行,然后是B的构造函数;销毁时,先执行B的析构函数,然后执行A的析构函数。我很确定,你不必担心这一点,不过C++会帮你处理这个问题。因此,不要试图找出一种方法来调用超类上的delete。 |
8
0
这
将导致未定义的行为-不允许访问已返回堆的内存。相反,它应该是:
|
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |