我有一个简单的destructor
方法可以销毁每个节点,但我遇到了一些问题。每当我尝试从链表中删除一个项目时,该元素都会被删除,但之后所有以下元素也会被删除。如果我尝试打印或添加更多元素,我的程序会崩溃。崩溃后,我的文本编辑器会突出显示我的PrintNode
方法。
这是我的destructor
方法:
Node::~Node() {
delete next;
}
我正在使用此方法从列表中删除元素:
Node*Node::DeleteNode(Node *head, string a) {
if (head == NULL) return head;
head->next = DeleteNode(head->next, a);
if (head->get()==a) {
Node* temp = head->next;
next = NULL;
delete head;
return temp;
}
else {
return head;
}
}
然后我做了一个简单的打印:
void Node::PrintNode() {
cout << name << endl;
if (next) {
next->PrintNode();
}
}
为什么我的析构函数会导致我的程序崩溃?
答案 0 :(得分:0)
您只需删除节点,而不是指向它的链接。试试这个。
<select>
{% for product in products %}
<option value="{{ product.id }}">{{ product.name}}</option>
<div class="error">{{ form.product.id.errors }}</div>
{% endfor %}
</select>
<select name="product">
{% for product in products %}
<option value="{{ product.id }}">{{ product.name}}</option>
<div class="error">{{ form.product.id.errors }}</div>
{% endfor %}
</select>
删除 删除下一步;
从析构函数中,它应该保持为空,编译器会在你使用时自动调用它 删除并删除该节点,但您还应删除指向该节点的链接,以便写入
delete head;
head=NULL;
行后
head=NULL;
答案 1 :(得分:0)
首先,即使搜索字符串位于第一个节点,它也总是会有n个递归调用,n个赋值。
Node*Node::DeleteNode(Node *head, string a) {
if (head == NULL) return head;
head->next = DeleteNode(head->next, a); // n calls, n assignments
if (head->get()==a) {
Node* temp = head->next;
next = NULL;
delete head;
return temp;
}
else {
return head;
}
}
可能存在问题:
Node::~Node() {
if(next) {
delete next;
}
}