【发布时间】:2019-04-14 20:41:14
【问题描述】:
运行此代码时出现SIGSEGV 错误。
代码编译,调试器显示指针中的随机地址。
use std::ptr;
pub struct List<T> {
head: *mut Node<T>,
tail: *mut Node<T>,
}
struct Node<T> {
data: Option<T>,
next: *mut Node<T>,
prev: *mut Node<T>,
}
impl<T> List<T> {
pub fn new() -> Self {
Self {
head: ptr::null_mut(),
tail: ptr::null_mut(),
}
}
pub fn add_tail(&mut self, data: T) {
let mut new_node = Box::new(Node {
data: Some(data),
next: ptr::null_mut(),
prev: ptr::null_mut(),
});
let new_node_ptr: *mut Node<T> = &mut *new_node;
if self.tail.is_null() {
self.head = new_node_ptr;
} else {
new_node.next = self.tail;
unsafe {
(*self.tail).prev = new_node_ptr;
}
}
self.tail = new_node_ptr;
}
pub fn remove_tail(&mut self) -> Option<T> {
if self.tail.is_null() {
None
} else {
let old_tail_ptr = self.tail;
unsafe {
if (*old_tail_ptr).next.is_null() {
self.tail = ptr::null_mut();
self.head = ptr::null_mut();
} else {
let new_tail_ptr = (*old_tail_ptr).next;
(*old_tail_ptr).next = ptr::null_mut();
(*new_tail_ptr).prev = ptr::null_mut();
self.tail = new_tail_ptr;
}
(*old_tail_ptr).data.take()
}
}
}
}
我的测试添加了十个整数0..9,然后它们弹出它们。在第二次弹出时,我得到 p>
信号:11,SIGSEGV:无效的内存引用。
【问题讨论】:
-
let mut new_node = Box::new将在drop超出范围后分配Node,在let new_node_ptr: *mut Node<T> = &mut *new_node;中留下一个悬空指针。而且我不确定你为什么在这里使用不安全的代码 -
simple 和 双向链表——如果你关心这些数据类型到底有多复杂,我发现你没有被正确地介绍过内存安全... (Learn Rust With Entirely Too Many Linked Lists)
-
“我的测试加了十个整数
0..9”那只有9个整数。
标签: list pointers linked-list rust unsafe