如果我复制一个指针然后释放它,原始数据会消失吗?
If I copy a pointer and then free it, does the original data disappear?
我正在尝试用 C 语言创建一个链表,我想知道一旦我释放它 cursor
会发生什么。
cursor
指向与 head
相同的结构,所以当我释放 cursor
时,它是否也会释放 head
指向的任何内容?
static struct node* head = NULL;
int length()
{
int counter = 0;
struct node *cursor = head;
if(cursor)
{
while((*cursor).next)
{
cursor = (*cursor).next;
counter++;
}
}
free(cursor);
return counter;
}
正如我从您的代码中看到的,一旦您删除 cursor
,列表中的最后一个元素也将被删除。
可能是,您实际上不需要在 length
方法中调用 free
,因为 length
等方法不应修改正在处理的数据。
我想提一下,cursor
是一个简单的指针,所以 cursor
的内存是在堆栈上分配的,并在方法完成后自动释放。它不是在堆上分配的对象,它只是指针,所以你不应该关心任何内存释放。
还要注意在取消引用之前检查 cursor
不是 NULL
。
如果两个指针具有相同的值,即它们都指向同一个对象,并且其中一个指针已被释放,则另一个指针将具有无效值,因为它指向的对象尚不存在。
至于你的功能那就错了
不需要释放指针cursor
。我认为该函数应该计算列表中的节点。在这种情况下,即使列表只包含不等于 NULL 的头部,它也必须被计数。
函数可以如下所示
静态结构节点* head = NULL;
int length()
{
int counter = 0;
for ( struct node *cursor = head; cursor != NULL; cursor = cursor->next )
{
++counter;
}
return counter;
}
是的。您释放一个内存地址,而不是变量本身。
一旦指针被释放,使用原始指针或该指针的副本访问其以前的元素、打印指针、复制指针等都是未定义的行为。
原始数据会消失吗?也许,也许不是——是UB。
安全问题:如果指针指向敏感数据,free(pointer)
不一定会消除对数据的访问。代码应该在释放之前清理数据。其他问题也适用。
我正在尝试用 C 语言创建一个链表,我想知道一旦我释放它 cursor
会发生什么。
cursor
指向与 head
相同的结构,所以当我释放 cursor
时,它是否也会释放 head
指向的任何内容?
static struct node* head = NULL;
int length()
{
int counter = 0;
struct node *cursor = head;
if(cursor)
{
while((*cursor).next)
{
cursor = (*cursor).next;
counter++;
}
}
free(cursor);
return counter;
}
正如我从您的代码中看到的,一旦您删除 cursor
,列表中的最后一个元素也将被删除。
可能是,您实际上不需要在 length
方法中调用 free
,因为 length
等方法不应修改正在处理的数据。
我想提一下,cursor
是一个简单的指针,所以 cursor
的内存是在堆栈上分配的,并在方法完成后自动释放。它不是在堆上分配的对象,它只是指针,所以你不应该关心任何内存释放。
还要注意在取消引用之前检查 cursor
不是 NULL
。
如果两个指针具有相同的值,即它们都指向同一个对象,并且其中一个指针已被释放,则另一个指针将具有无效值,因为它指向的对象尚不存在。
至于你的功能那就错了
不需要释放指针cursor
。我认为该函数应该计算列表中的节点。在这种情况下,即使列表只包含不等于 NULL 的头部,它也必须被计数。
函数可以如下所示
静态结构节点* head = NULL;
int length()
{
int counter = 0;
for ( struct node *cursor = head; cursor != NULL; cursor = cursor->next )
{
++counter;
}
return counter;
}
是的。您释放一个内存地址,而不是变量本身。
一旦指针被释放,使用原始指针或该指针的副本访问其以前的元素、打印指针、复制指针等都是未定义的行为。
原始数据会消失吗?也许,也许不是——是UB。
安全问题:如果指针指向敏感数据,free(pointer)
不一定会消除对数据的访问。代码应该在释放之前清理数据。其他问题也适用。