当前位置: 首页 > article >正文

【C++】关于指针Free和链表循环释放的问题

关于指针Free和链表循环的问题

  • 由于在做某项目的主架构师,有大半年时间没有手敲过代码了。虽然一直有在review代码(各种语言的…),但是业务居多。
  • 最近经历某个诡异的Bug,在链表循环时会莫名崩溃。最后查下来,都是基础的知识点(一下子没想起来…)。这里记录一下(不涉及任何项目内容,只涉及基础技术)

指针Free

其实就是释放指针对象。考虑下面的伪代码

void freeMe(void* p)
{
	assert(p != NULL)
	delete p;
	p = NULL;
}

int main()
{
	int* testMe = new int(1);
	freeMe(testMe);
	if (testMe == NULL) {
		// testMe是否为NULL???
	}
}
  • 上述代码中,testMe是否能释放?testMe判空是否生效?
  • testMe可以释放,但是testMe判空不生效。形参只是指向了一份相同的地址,让形参指向空,不会让testMe指向NULL。

该问题可以通过下述方式解决

void freeMe(void* p)
{
	assert(p != NULL)
	delete p;
	p = NULL;
}

void freeMeReal(void** p)
{
    assert(p != NULL);
    freeMe(*ptr)
    *p = NULL;
}

int main()
{
	int* testMe = new int(1);
	freeMe(&testMe);
	if (testMe == NULL) {
		// testMe为空。
	}
}

链表循环释放

  • 链表在循环释放时,如果操作不当,可以会访问一块非法地址。导致崩溃现象。考虑如下代码
struct Node
{
	struct Node *next;
	void* data;
} Node_t;

struct List {
    Node *head;
    Node *tail;
} List_t;

void fff() {
    List MyList;
	for (Node t = MyList.head; t != NULL,  t = t->next) {
			if (等于某个条件下删除) {
					Node * next = t->next;
					// 让前一个节点,指向被删除节点的next
					prev->next = next;
					free(t);
					// 这俩就会产生问题,t已经被释放了,但是下次仍使用t->next
			}
     }
}
  • 上述代码的问题在于,当前节点已被删除的情况下。使用了被free掉的地址,进行Next操作。这样会导致概率性崩溃
  • 修改方式。
void fff() {
    List MyList;
	for (Node t = MyList.head; t != NULL,  t = t->next) {
			if (等于某个条件下删除) {
					Node * next = t->next;
					// 让前一个节点,指向被删除节点的next
					prev->next = next ;
					free(t);
					// 将t指向上一个节点。
					t = prev;
			}
     }
}

http://www.kler.cn/a/407480.html

相关文章:

  • [Redis#0] iredis: linux上redis超好用的环境配置
  • ElasticSearch7.x入门教程之集群安装(一)
  • 物业管理系统的设计和实现
  • Kubernetes的pod控制器
  • Day24 回溯算法part03
  • 人工智能(AI)与机器学习(ML)基础知识
  • websocket消息的实现
  • 【公开笔记】小白学习vue3完整版
  • 智能体来了:构建用于具有结构化输出的内容审核的智能 AI Agent 智能体
  • 【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding
  • 联想ThinkServer服务器主要硬件驱动下载
  • 【单片机基础】如何选择合适的低功耗单片机
  • YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路
  • 10 —— Webpack打包模式
  • Linux使用经验记录
  • 韦东山hal库 使用光敏传感器控制蜂鸣器
  • GoZero对接GPT接口的设计与实现:问题分析与解决
  • 深入探索:JavaScript中实现乱序函数的艺术
  • 电脑禁用U盘的四种简单方法(电脑怎么阻止u盘使用)
  • HDR视频技术之三:色度学与颜色空间
  • [CISCN 2019初赛]Love Math 详细题解
  • Centos Stream 9安装Jenkins-2.485 构建自动化项目步骤
  • 【SKFramework框架核心模块】3-2、音频管理模块
  • 第10章 JavaScript的应用作业
  • 数据集-目标检测系列- 昙花(昙花一现) 检测数据集 epiphyllum >> DataBall
  • 机器学习周志华学习笔记-第6章<支持向量机>