关于this指针的疑问

computingbear 2013-02-19 10:56:16
最近遇到一个奇怪的BUG,在实现一个链表的结构并测试其删除节点的功能时,程序突然出现异常,Debug显示异常来自如下代码段:
void SetPrev(Node* node)
{
this->prev = node;
}
我Debug的时候查看了this指针的值,发现this == NULL。
我就不明白了,都delete掉了,this指针都为NULL了,怎么还能访问SetPrev这个函数?
然后过了一段时间我再次运行,又好了。难不成出现Bug还是个概率问题?
补充一点就是在调用SetPrev函数之前,我都事先判断了当前节点是否为空,即
if(node != NULL)
{
node->SetPrev(node);
}
所以按理说不应该出现空指针调用SetPrev的情况。不知各位有什么高见?
...全文
310 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
computingbear 2013-02-19
  • 打赏
  • 举报
回复
哦,我刚发现有一点没注意,就是我调用删除节点函数时,代码是这样写的 //... while(某节点 != NULL) { if(满足某个条件) { 某节点 = 链表->DelItemByPoint(某节点);//这里可能有问题 if(某节点为空) return; 某节点 = 某节点->GetNext(); } } //...
computingbear 2013-02-19
  • 打赏
  • 举报
回复
关键是现在运行又好了,是不是用了模版后的问题,我只是担心以后又出现异常。
computingbear 2013-02-19
  • 打赏
  • 举报
回复
哦,不好意思我没考虑周到,我之前给出的是示意代码,SetPrev是成员函数
氰客 2013-02-19
  • 打赏
  • 举报
回复
看看堆栈调用流程0 0是谁来调的?
xiaoji0507 2013-02-19
  • 打赏
  • 举报
回复
this 是不能用在非成员函数中的
computingbear 2013-02-19
  • 打赏
  • 举报
回复
回复2楼:不巧的是,编译过了... 回复3楼: delete node中node是一个指向某个节点的临时指针,就算我赋值为NULL也没啥作用啊。 回复4楼: 删除节点的代码如下:

template <typename T2>
T2* SpriteStore<T2>::DelItemByPoint(T2* t2)
{
	if(t2 == NULL)
		return NULL;
	T2* prev = t2->GetPrev();
	T2* next = t2->GetNext();
	if(NULL == prev)
	{
		this->head = next;
		if(this->head != NULL)
			this->head->SetPrev(NULL);
	}
	else
	{
		prev->SetNext(next);
		if(next != NULL)
		{
			next->SetPrev(prev);
		}
		else
		{
			link = prev;
		}
	}
	delete t2;
        //这里没加t2 = NULL;
	nSize--;
	return prev;
} 
Mr_Right 2013-02-19
  • 打赏
  • 举报
回复
我觉得楼上的说的很有可能!能不能把你定义的链表结构发上来。
FingerStyle 2013-02-19
  • 打赏
  • 举报
回复
void SetPrev(Node* node) { if(this != NULL) this->prev = node; } 这代码是不合理的。 不需要判断this是否为空。 应该是你删除node的过程有逻辑问题。 node 被delete掉了,但是没给NULL. 查看代码 有没有 delete node; node = NULL; if(node != NULL) { node->SetPrev(node) }
caoh110 2013-02-19
  • 打赏
  • 举报
回复
你的代码编译能过么,this是用在类内部的,void SetPrev(Node* node)你定义的是全局变量?
computingbear 2013-02-19
  • 打赏
  • 举报
回复
是不是我应该改成 void SetPrev(Node* node) { if(this != NULL) this->prev = node; }
内容概要:本文围绕三相并网逆变器的控制策略展开研究,重点探讨了虚拟阻抗与统一有源阻尼相结合的控制方法,并实现了SVPWM(空间矢量脉宽调制)与SPWM(正弦脉宽调制)两种调制方式在Simulink平台下的仿真建模。通过引入虚拟阻抗改善系统输出阻抗特性,结合统一有源阻尼技术有效抑制LC或LCL滤波器引起的谐振问题,从而提升逆变器在弱电网条件下的并网稳定性与电能质量。研究涵盖了控制策略的设计、调制算法的实现、动态响应分析及谐波抑制效果评估,同时拓展涉及正负序分离、中点电位平衡、DPWMA调制等关键技术,构建了完整的高性能并网逆变器控制系统仿真体系。; 适合人群:适用于从事电力电子、新能源发电、智能电网及相关领域的研究生、科研人员和工程技术人员,特别是具备三相并网逆变器控制理论基础并熟悉MATLAB/Simulink仿真环境的专业人士;; 使用场景及目标:①用于高校与科研机构开展并网逆变器稳定性与控制策略的深入研究;②支撑学位论文撰写、学术期刊投稿或科研项目申报中的仿真验证工作;③为企业研发高性能、高可靠性的并网逆变器产品提供先进的控制方案与技术原型支持;; 阅读建议:建议读者结合提供的Simulink模型文件进行实际操作与仿真验证,重点关注虚拟阻抗参数设计与有源阻尼的协同作用机制,深入理解不同调制策略对系统性能的影响,并可进一步拓展学习文中提及的正负序控制、中点电位平衡等先进控制技术,全面提升对复杂电网环境下并网系统稳定运行机制的认知水平。

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧