帕斯卡外部:SIGSEGV

问题描述 投票:0回答:2

我有一个使用链表的程序。当它到达

时,它会因
External:SIGSEGV

而崩溃

new(R);R:=queue;queue:=queue.Next;dispose(R);

在 dispose(R) 之后,我将删除队列列表的第一个元素。更奇怪的是 - 当我将其更改为

queue:=queue.Next
时,即只是向前移动而不转储元素 - 在执行此命令后它仍然崩溃。值得一提的是
queue.Next=nil
的值。当我尝试
queue:=nil;
时,它也崩溃了,让我非常困惑。有人可以帮助我吗?
编辑:我已经上传了整个代码here,相关行没有。 128.

pascal freepascal
2个回答
0
投票

问题是我稍后取消引用指针,而拉撒路无法回溯到该位置,因此他指向指针设置为 nil 的行。


0
投票

很高兴看到您的问题得到解决,但是您的代码中存在内存泄漏。

目前,完整代码的链接会显示一个页面,其中包含错误网关错误 - 代码 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)
)是多余的。您不需要分配一个指针来在其中存储另一个指针。

© www.soinside.com 2019 - 2024. All rights reserved.