链表pop_back实现忽略指向nullptr的指针
Linked list pop_back implementation ignores pointer-to-nullptr
假设我的实现中只允许使用new
和delete
,而不允许使用智能指针。我没有使用sentinel节点。
以下是我对pop_back
:的实现
void sLinkedList::pop_back()
{
if(begin == nullptr)
{
std::cerr << "There is nothing to pop." << std::endl;
}
else
{
node* nodeToDelete = begin;
while(nodeToDelete->next != nullptr)
{
nodeToDelete = nodeToDelete->next;
}
delete nodeToDelete;
nodeToDelete = nullptr;
--mSize;
}
}
它所做的是创建一个指向节点nodeToDelete
的指针,并遍历整个列表,直到到达最后一个节点(指向nullptr的节点(。然后我删除最后一个节点,将其设置为nullptr,一切都应该很好,因为在此之前的节点(以前是倒数第二个节点(现在指向一个nullptr,标记列表的末尾。
当我按照以下说明运行main时:
int main()
{
sLinkedList newList;
std::cout << "Length is " << newList.length() << std::endl;
newList.print();
newList.push_front(4);
std::cout << "Length is " << newList.length() << std:: endl;
newList.print();
newList.pop_back();
std::cout << "Length is " << newList.length() << std::endl;
newList.print();
}
我得到输出:
Length is 0
The list is empty.
Length is 1
4
Length is 0
4 // should print "There is nothing to pop."
在第一个之后直接添加另一个CCD_ 5得到CCD_。
为什么这个想法不起作用?
好吧,但对吗?
当您指定nodeToDelete=nodeToDelete->next时;您的意思是,您的本地指针nodeToDelete现在引用了与nodeToDelete->next相同的内存位置。这两个指针之间没有其他关系。因此,当您指定nodeToDelete=nullptr;你实际上什么也没做:本地指针再也不用了,所以它指向的内存区域并不重要。
不幸的是,尽管您删除了该节点,但应该是最后一个节点仍然指向它以前的位置,因此您的下一个pop_back调用愉快地迭代到不可访问的内存中。
我想这是家庭作业,所以我可能不应该为你重写。但是,您可以通过实际修改应该是最后一个节点来修复它,而不仅仅是它下一个指针的本地副本。
当然,如果这是一个真正的项目,std::forward_list可能会有所帮助。:v
一切都应该很好,因为在此之前的节点(以前是倒数第二个节点(现在指向一个nullptr,标记列表的末尾。
好吧,但是吗?
当您分配nodeToDelete = nodeToDelete->next;
时,您的本地指针nodeToDelete
现在指向与nodeToDelete->next
相同的内存位置。这两个指针之间没有其他关系。因此,当你分配nodeToDelete = nullptr;
时,你实际上什么也没做:本地指针再也不用了,所以它指向的内存区域并不重要
不幸的是,应该是最后一个节点仍然指向它过去的位置,即使您对该节点进行了delete
d,因此您的下一个pop_back
调用愉快地迭代到不可访问的内存中。
我想这是家庭作业,所以我可能不应该为你重写。但是,您可以通过实际修改应该是最后一个节点来修复它,而不仅仅是它的next
指针的本地副本。
当然,如果这是一个真正的项目,std::forward_list
可能会有所帮助v
- 将指针设置为"nullptr"并不能防止双重删除?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- boost::spirit指针属性是用nullptr初始化的吗?
- unique_ptr<T>::get() 返回的指针在原始unique_ptr被销毁后不是 nullptr
- 在C++中将指针数组的所有元素设置为 nullptr
- 以原子方式交换指针与 nullptr
- 指向抽象类的指针数组:指向 nullptr 或不指向 nullptr (C++)
- 仅当指针不是 nullptr 时才调用方法
- C++链表指针始终为 nullptr
- 为什么分配了 nullptr 的指针可以调用成员函数?
- 空向量占用的空间是否与指向当前设置为 nullptr 的类型的指针一样多
- 如何使用nullptr初始化同一类对象的静态指针数组?
- 为什么我不能使用 nullptr 初始化自动推导的指针?
- std::unique_ptr 是否在其析构函数中将其基础指针设置为 nullptr?
- 我可以得到指向 nullptr 的指针的指针吗,它是否有效
- C++ 仅设置对象指向 nullptr 的指针
- 在类ctor中的默认nullptr指针给出了无法解析的外部符号c++