公司网站建设方案模板,厦门跨境电商前十,wordpress安卓版怎么用,网站建设主机记一次bug调试。。。。
我定义了一个类#xff0c;测试的时候#xff0c;调用它的方法出现了free(): double free detected #xff0c;但是调用其他方法是正常的。这个错误#xff0c;字面意思就是检测到了双重释放。是指对于同一块内存#xff0c;释放了两次。
我的类…记一次bug调试。。。。
我定义了一个类测试的时候调用它的方法出现了free(): double free detected 但是调用其他方法是正常的。这个错误字面意思就是检测到了双重释放。是指对于同一块内存释放了两次。
我的类里定义了指针变量。我一开始查的时候看到了这篇文章链接
这篇文章写的不错解释的很详细。描述的现象也挺符合我的代码。因为我确实没有写拷贝构造函数和赋值构造函数。而且我又重新翻了c primer plus这本书第六版的364页确实也描述这个现象。在构造函数中如果使用了new 来申请内存空间那么析构函数中一定要对应delete删除空间。
于是我加了拷贝构造函数和赋值构造函数并且严格审查了new和delete等对内存空间的操作。改好之后。再运行还是报这个错。直接懵逼。网上的其他答案也不靠谱。
于是我一步步地把这个方法里地代码删除想要排查是哪行代码出了问题。直到我把这个方法里地代码都删光了只要调用这个方法还是会出问题。再次懵逼。。。。
这时我的目光注意到了方法的传参上。这个方法的参数传入了另一个类A.method(B b) 这个类B中也有指针变量而且操作了内存空间。此时问题就出在了这。在main函数里我初始化一个类B b然后把这个b传入了类A的方法在类A方法执行结束后会调用B的析构函数把b给析构掉。而在main函数执行完之后会调用所有类的析构函数将实例化的类全部析构掉这其中也包括了b所以b的析构函数被调用了两次也就是free了两次同一块内存空间。
解决办法在A的方法里不要传入对象传入B的指针就可以了。 具体点在main函数中定义B的指针: B *b new B(); 调用A的方法时传入这个指针A.method(b);