关于改进内置链表垃圾收集的建议 我目前正在学习链表,我自己在C++中构建一个,以便完全理解这个概念。每种方法似乎都有效。但是,我对自己实现的节点类和LinkedList类的垃圾收集没有信心。有人能看一下并提出一些建议吗?谢谢大家! #include <iostream> #include <vector> #include <map> template<class T> struct Node { T value; Node* next; Node() { next = nullptr; // Set the default of next to nullptr } ~Node() { if (next) { delete next; next = nullptr; } } }; template<class T> class LinkedList { private: Node<T>* head; Node<T>* tail; unsigned int length; Node<T>* traverseToIndex(const unsigned short& index); public: LinkedList(); ~LinkedList(); void append(const T& value); void prepend(const T& value); void insert(const unsigned short& index, const T& value); void remove(const unsigned short& index); }; int main() { LinkedList<int> nums; nums.append(5); nums.append(1); nums.append(3); nums.append(4); nums.remove(2); return 0; } template<class T> LinkedList<T>::LinkedList() { this->length = 0; head = new Node<T>; tail = head; } template<class T> LinkedList<T>::~LinkedList() { delete head; } template<class T> Node<T>* LinkedList<T>::traverseToIndex(const unsigned short& index) { if (index >= this->length) return tail; Node<T>* currentNode = head; for (unsigned short i = 0; i < index; i++) { currentNode = currentNode->next; } return currentNode; } template<class T> void LinkedList<T>::append(const T& value) { if (length == 0) { head->value = value; } else { Node<T>* newNode = new Node<T>; newNode->value = value; tail->next = newNode; tail = newNode; } length++; } template<class T> void LinkedList<T>::prepend(const T& value) { Node<T>* newNode = new Node<T>; newNode->value = value; newNode->next = head; head = newNode; } template<class T> void LinkedList<T>::insert(const unsigned short& index, const T& value) { if (index >= this->length || index <= 0) return; Node<T>* before = this->traverseToIndex(index - 1); Node<T>* after = before->next; Node<T>* newNode = new Node<T>; newNode->value = value; newNode->next = after; before->next = newNode; this->length++; } template<class T> void LinkedList<T>::remove(const unsigned short& index) { Node<T>* before = this->traverseToIndex(index - 1); Node<T>* deletedNode = before->next; Node<T>* after = deletedNode->next; before->next = after; this->length--; } #包括 #包括 #包括 模板 结构体类型 { T值; 节点*下一步; 节点(){ next=nullptr;//设置nullptr旁边的默认值 } ~Node(){ 如果(下一个){ 删除下一步; next=nullptr; } } }; 模板 类链接列表 { 私人: 节点*头; 节点*尾部; 无符号整数长度; 节点*traverseToIndex(常量无符号短&索引); 公众: LinkedList(); ~LinkedList(); 无效附加(常量T和值); 无效预结束(常数T和值); 无效插入(常量无符号短和索引,常量T和值); void remove(const unsigned short&index); }; int main() { 链接列表nums; 追加(5); 追加(1); 追加(3); 追加(4); nums.移除(2); 返回0; } 模板 LinkedList::LinkedList() { 这个->长度=0; 头=新节点; 尾=头; } 模板 LinkedList::~LinkedList() { 删除标题; } 模板 节点*LinkedList::traverseToIndex(常量无符号短&索引) { 如果(索引>=此->长度)返回尾部; 节点*当前节点=头部; for(无符号短i=0;inext; } 返回当前节点; } 模板 void LinkedList::append(常量T和值) { 如果(长度==0){ 头->值=值; }否则{ Node*newNode=新节点; 新建节点->值=值; tail->next=newNode; tail=newNode; } 长度++; } 模板 void LinkedList::prepend(常量T和值) { Node*newNode=新节点; 新建节点->值=值; 新建节点->下一步=头部; 头=新节点; } 模板 void LinkedList::insert(常量无符号短和索引,常量T和值) { 如果(索引>=this->length |索引遍历索引(索引-1); 节点*之后=之前->下一步; Node*newNode=新节点; 新建节点->值=值; newNode->next=after; before->next=newNode; 这->长度++; } 模板 void LinkedList::remove(const unsigned short&index) { 节点*before=this->traverseToIndex(索引-1); 节点*deletedNode=before->next; Node*after=deletedNode->next; 之前->下一步=之后; 这个->长度--; }

关于改进内置链表垃圾收集的建议 我目前正在学习链表,我自己在C++中构建一个,以便完全理解这个概念。每种方法似乎都有效。但是,我对自己实现的节点类和LinkedList类的垃圾收集没有信心。有人能看一下并提出一些建议吗?谢谢大家! #include <iostream> #include <vector> #include <map> template<class T> struct Node { T value; Node* next; Node() { next = nullptr; // Set the default of next to nullptr } ~Node() { if (next) { delete next; next = nullptr; } } }; template<class T> class LinkedList { private: Node<T>* head; Node<T>* tail; unsigned int length; Node<T>* traverseToIndex(const unsigned short& index); public: LinkedList(); ~LinkedList(); void append(const T& value); void prepend(const T& value); void insert(const unsigned short& index, const T& value); void remove(const unsigned short& index); }; int main() { LinkedList<int> nums; nums.append(5); nums.append(1); nums.append(3); nums.append(4); nums.remove(2); return 0; } template<class T> LinkedList<T>::LinkedList() { this->length = 0; head = new Node<T>; tail = head; } template<class T> LinkedList<T>::~LinkedList() { delete head; } template<class T> Node<T>* LinkedList<T>::traverseToIndex(const unsigned short& index) { if (index >= this->length) return tail; Node<T>* currentNode = head; for (unsigned short i = 0; i < index; i++) { currentNode = currentNode->next; } return currentNode; } template<class T> void LinkedList<T>::append(const T& value) { if (length == 0) { head->value = value; } else { Node<T>* newNode = new Node<T>; newNode->value = value; tail->next = newNode; tail = newNode; } length++; } template<class T> void LinkedList<T>::prepend(const T& value) { Node<T>* newNode = new Node<T>; newNode->value = value; newNode->next = head; head = newNode; } template<class T> void LinkedList<T>::insert(const unsigned short& index, const T& value) { if (index >= this->length || index <= 0) return; Node<T>* before = this->traverseToIndex(index - 1); Node<T>* after = before->next; Node<T>* newNode = new Node<T>; newNode->value = value; newNode->next = after; before->next = newNode; this->length++; } template<class T> void LinkedList<T>::remove(const unsigned short& index) { Node<T>* before = this->traverseToIndex(index - 1); Node<T>* deletedNode = before->next; Node<T>* after = deletedNode->next; before->next = after; this->length--; } #包括 #包括 #包括 模板 结构体类型 { T值; 节点*下一步; 节点(){ next=nullptr;//设置nullptr旁边的默认值 } ~Node(){ 如果(下一个){ 删除下一步; next=nullptr; } } }; 模板 类链接列表 { 私人: 节点*头; 节点*尾部; 无符号整数长度; 节点*traverseToIndex(常量无符号短&索引); 公众: LinkedList(); ~LinkedList(); 无效附加(常量T和值); 无效预结束(常数T和值); 无效插入(常量无符号短和索引,常量T和值); void remove(const unsigned short&index); }; int main() { 链接列表nums; 追加(5); 追加(1); 追加(3); 追加(4); nums.移除(2); 返回0; } 模板 LinkedList::LinkedList() { 这个->长度=0; 头=新节点; 尾=头; } 模板 LinkedList::~LinkedList() { 删除标题; } 模板 节点*LinkedList::traverseToIndex(常量无符号短&索引) { 如果(索引>=此->长度)返回尾部; 节点*当前节点=头部; for(无符号短i=0;inext; } 返回当前节点; } 模板 void LinkedList::append(常量T和值) { 如果(长度==0){ 头->值=值; }否则{ Node*newNode=新节点; 新建节点->值=值; tail->next=newNode; tail=newNode; } 长度++; } 模板 void LinkedList::prepend(常量T和值) { Node*newNode=新节点; 新建节点->值=值; 新建节点->下一步=头部; 头=新节点; } 模板 void LinkedList::insert(常量无符号短和索引,常量T和值) { 如果(索引>=this->length |索引遍历索引(索引-1); 节点*之后=之前->下一步; Node*newNode=新节点; 新建节点->值=值; newNode->next=after; before->next=newNode; 这->长度++; } 模板 void LinkedList::remove(const unsigned short&index) { 节点*before=this->traverseToIndex(索引-1); 节点*deletedNode=before->next; Node*after=deletedNode->next; 之前->下一步=之后; 这个->长度--; },c++,linked-list,C++,Linked List,对于足够长的列表,由于递归调用下一步删除;中的~Node(),会导致堆栈溢出 解决方法是在节点中没有析构函数。链接列表的析构函数应该循环遍历列表并销毁节点。对其他工作代码进行改进的问题更适合于删除不删除节点。您还需要阅读这篇文章,它并没有解决问题,但是>节点destructor的功能远远超出了它的需要。删除空指针是可以的,因此如果(next)测试if是无意义的。而将next`设置为nullptr也是无意义的,因为对象将离开,其next成员将不再存在。只需将其更改为delete next;。 ~N

对于足够长的列表,由于递归调用
下一步删除;
中的
~Node()
,会导致堆栈溢出


解决方法是在
节点中没有析构函数。
链接列表
的析构函数应该循环遍历列表并销毁节点。

对其他工作代码进行改进的问题更适合于
删除
不删除节点。您还需要阅读这篇文章,它并没有解决问题,但是
>节点
destructor的功能远远超出了它的需要。删除空指针是可以的,因此如果(next)测试
if是无意义的。而将
next`设置为
nullptr
也是无意义的,因为对象将离开,其
next
成员将不再存在。只需将其更改为
delete next;
~Node() {
    if (next) {
        delete next;
        next = nullptr;
    }
}