我有一个使用链表的程序。当它到达
时,它会因
External:SIGSEGV
而崩溃
new(R);R:=queue;queue:=queue.Next;dispose(R);
在 dispose(R) 之后,我将删除队列列表的第一个元素。更奇怪的是 - 当我将其更改为
queue:=queue.Next
时,即只是向前移动而不转储元素 - 在执行此命令后它仍然崩溃。值得一提的是queue.Next=nil
的值。当我尝试queue:=nil;
时,它也崩溃了,让我非常困惑。有人可以帮助我吗?
问题是我稍后取消引用指针,而拉撒路无法回溯到该位置,因此他指向指针设置为 nil 的行。
很高兴看到您的问题得到解决,但是您的代码中存在内存泄漏。
目前,完整代码的链接会显示一个页面,其中包含错误网关错误 - 代码 502。所以我假设:
type
PNode = ^TNode;
TNode = record
next: PNode;
data: integer;
end;
var:
queue, R: PNode;
使用
new(R)
语句,为 R
分配了空间,然后,由于 R
是一个指针,它指向新创建的内存位置,就像这样:
┌──────────────────────────────┐
queue──────▶│An existing TNode instance │
├──────────────────────────────┤
│next ├──────▶nil
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│data │
└──────────────────────────────┘
┌──────────────────────────────┐
R──────────▶│a TNode allocated with new(R) │
├──────────────────────────────┤
│next ├──────▶nil
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│data │
└──────────────────────────────┘
在第二个语句中,您将指向
queue
目标的指针存储在 R
中:
┌──────────────────────────────┐
queue───┬──▶│An existing TNode instance │
│ ├──────────────────────────────┤
│ │next ├──────▶nil
│ ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ │data │
│ └──────────────────────────────┘
│ ┌──────────────────────────────┐
R───────┘ │a TNode allocated with new(R) │
├──────────────────────────────┤
│next ├──────▶nil
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│data │
└──────────────────────────────┘
现在,
queue
和R
都指向相同的位置,并且您新分配的内存变成了孤儿。由于您没有引用它,因此您无法处置它们,并且它会被泄露。
实际上,你的第一句话(
new(R)
)是多余的。您不需要分配一个指针来在其中存储另一个指针。