c++ - 运行时错误 - 地址释放后堆使用
问题描述
我被困在一个问题上,无法弄清楚为什么我在释放后会使用运行时错误堆。我读到过,当我们释放一些内存然后用指针访问它时,可能会出现这个错误,但在我的代码中我没有释放什么,为什么会出现这个错误。让我解释一下,我有一个包含 3 个节点 0->2->1->NULL 的链表。目前,我的第二个指针指向 2,我只想更改链接 1->2。现在,当我分配 pre=NULL,cur=second->next 时,它可以正常工作并成功运行,但是当我执行 pre=second 和 cur=second->next 时,它会给出这个运行时错误。我的意思是我不在乎 2 应该指向NULL 让 2 指向 1,但我希望我的 1 应该指向 2。这是代码:这会产生运行时错误,而在我的本地编译器中它正在成功运行。
#include<iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution
{
public:
int length(ListNode* temp)
{
int count=0;
while(temp!=NULL)
{
temp=temp->next;
count++;
}
return count;
}
bool isPalindrome(ListNode* head)
{
bool flag=1;
int len=length(head)/2; //FUNCTION TO RETURN LENGTH OF LINKED LIST
ListNode *first=head,*second=head;
for(int i=1;i<=len;i++)
{
second=second->next;
}
ListNode *pre=second,*cur=second->next;
while(cur!=NULL)
{
ListNode *temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
for(int i=1;i<=len;i++)
{
if(first->val!=pre->val)
{
flag=0;
break;
}
first=first->next;
pre=pre->next;
}
return flag;
}
};
int main()
{
bool ans;
ListNode *head=NULL;
ListNode *temp=new ListNode(0);
head=temp;
temp=new ListNode(2);
head->next=temp;
temp=new ListNode(1);
head->next->next=temp;
Solution obj1;
ans=obj1.isPalindrome(head);
cout<<ans<<endl;
}
这是正确的代码,仅更改为 pre=NULL,cur=second。顺便说一下,在下一次迭代中 pre 将变为第二个,cur 将变为 second->next,这与上述提供运行时的解决方案相同。
ListNode *pre=NULL,*cur=second;
while(cur!=NULL)
{
ListNode *temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
解决方案
我猜你正在解决234。如果是这样的话,那么这将通过:
struct Solution {
ListNode* temp;
bool isPalindrome(ListNode* head) {
temp = head;
return is_palindrome(head);
}
private:
bool is_palindrome(const ListNode* node) {
if (node == NULL) {
return true;
}
bool check_for_palindrome = is_palindrome(node->next) & (temp->val == node->val);
temp = temp->next;
return check_for_palindrome;
}
};
虽然不确定你的错误!
参考
推荐阅读
- amazon-web-services - 在 Terraform 中如何处理错误?
- reactjs - 将道具值从一个类传递到另一个类
- aws-iot - AWS IoT - 事物组的影子更新
- windows - Net::XMPP Perl 模块:Windows 系统上的 ssl 路径错误
- python - 无法与 upwork 连接以获取任何信息
- laravel - Laravel - 电子邮件确认后停止自动登录
- c# - 如何在 Autofac 模块的依赖注入中注入 IHostedService
- python - selenium.common.exceptions.WebDriverException:消息:无效参数:无法终止退出的进程
- excel - 如何从工作表中的所有单元格中删除特殊字符
- c# - 如何使用 selenium +C#.NET 在 jsp 页面中获取控件的 WebElement