以下代码为什么会double free? #include <iostream> #include <memory> using namespace std; class Point { public: Point(int ix = 0, int iy = 0): _ix(ix), _iy(iy) { cout << "Point(int,int)" << endl; } shared_ptr<Point> addPoint(Point & pt) { _ix += pt._ix; _iy += pt._iy; return shared_ptr<Point>(this); } ~Point() { cout << "~Point()" << endl; } private: int _ix; int _iy; }; int main() { shared_ptr<Point> sp(new Point(1, 2)); shared_ptr<Point> sp2(new Point(11, 12)); shared_ptr<Point> sp3(sp->addPoint(*sp2)); }
时间: 2023-08-21 08:43:17 浏览: 60
#include <iostream> #include<iomanip> using namespace std;九九乘法表
这段代码会导致 double free 的原因是在 Point 类的 addPoint 函数中返回了指向 this 的 shared_ptr 智能指针对象,导致了对象的所有权被多次转移,从而导致了重复释放对象内存的错误。
具体来说,在这段代码中,addPoint 函数返回的 shared_ptr 智能指针对象 sp3 持有了指向 this 的指针,也就是指向了 sp 指针所指向的 Point 类对象的内存。然而,在后面的代码中,sp 和 sp2 指针所指向的对象也都被用 shared_ptr 对象管理,因此当 sp 和 sp2 离开作用域时,它们会分别调用一次析构函数释放对象内存,但此时对象内存已经被 sp3 的所有权所持有,因此会导致 double free 的错误。
为了解决这个问题,可以将 addPoint 函数的返回类型改为 shared_ptr<Point>,然后通过调用 shared_ptr 的构造函数来创建一个新的 shared_ptr 智能指针对象,从而避免多次转移对象所有权导致的错误。
阅读全文