连续两次free()同一个指针的报错

程序具有一定规模后,对指针的操作很容易犯错,导致堆破坏。下面主要讲一下用free()释放由malloc()或calloc()申请的空间问题。

先贴一篇论坛比较好的讨论帖:http://bbs.youkuaiyun.com/topics/390121909 这篇主要讨论了调用free()主要是释放了什么?

简单的说就是:free()函数释放了指针在堆上指向的空间,这仅是向操作系统表明“这片空间我不要了,你回收吧!”。然而该指针还是指向这片空间,这时若要对这个指针进行读写操作非常危险,容易引发灾难。

好吧,现在进入正题。(以下的分析认为你已经知道上面这些了)

Img是自定义的结构体(不重要),将释放函数写成函数的形式,方便多次调用。

static __inline void free_gaussImg(Img* img)
{	
	if( img )
	{
		if( img->imageData )
		{
			free( img->imageData );
			img->imageData = NULL;
		}
		free( img );
		img = NULL;
	}
}
开始以为这种方式非常好,不仅释放掉空间,还赋上了NULL。自以为可以规避两次连续释放同一个指针所带来的系统的报错,还用了static和inline,然并卵。

free_gaussImg( img1 );
free_gaussImg( img1 );

Qt报错 "double free corruption (out)" 通常是由于程序试图释放已经被释放的内存,或者在释放内存时发生了越界操作。这种错误会导致程序崩溃或产生不可预知的行为。以下是一些可能的原因和解决方法: ### 可能的原因 1. **多次释放同一块内存**: - 同一个指针多次调用 `delete` 或 `free`。 2. **指针未初始化**: - 指针在使用前没有被正确初始化,导致释放了未知的内存地址。 3. **指针越界**: - 指针操作越界,导致内存管理结构被破坏。 4. **错误的内存管理**: - 使用了错误的内存管理函数,例如在 `new[]` 分配的内存上使用 `delete`,或在 `new` 分配的内存上使用 `delete[]`。 ### 解决方法 1. **检查内存释放**: - 确保每个 `new` 或 `malloc` 分配的内存只对应一个 `delete` 或 `free`。 2. **初始化指针**: - 在使用指针前,确保指针已经被正确初始化。 3. **使用智能指针**: - 在C++中,尽量使用智能指针(如 `std::unique_ptr` 或 `std::shared_ptr`)来管理内存,避免手动管理内存带来的问题。 4. **内存调试工具**: - 使用内存调试工具(如 Valgrind、AddressSanitizer)来检测内存泄漏和越界问题。 5. **代码审查**: - 仔细审查代码,确保所有内存分配和释放操作都是正确的。 ### 示例 ```cpp #include <iostream> #include <memory> int main() { // 错误的内存管理示例 int* ptr = new int(10); delete ptr; delete ptr; // 错误的:同一块内存被释放两次 // 正确的内存管理示例 std::unique_ptr<int> uniquePtr(new int(10)); // 不需要手动调用 delete,智能指针会自动管理内存 return 0; } ``` 在上述示例中,第一次释放内存是正确的,但第二次释放同一块内存会导致 "double free corruption" 错误。使用智能指针可以避免这种问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值