C++ 为什么我的程序出现错误 free(): double free detected in tcache 2 in GDB
C++ Why is my program getting the error free(): double free detected in tcache 2 in GDB
所以我不得不为 Udemy 的课程做这个练习,我完成了它。但是 运行 在我自己的 GDB 机器上,我得到了上面标题中的错误。我尝试检查销毁前后指针的值,并且 start 的值在析构函数的行和复制(都在 main 的范围内)上表现异常 在第一次调用析构函数时我无法访问开始和破坏后 start->x 的值(它正常打印)为零(预期)但在第二个析构函数中,应该为 3 的 start->x 的值也为零。但是我的代码中没有任何内容告诉我(它可能会告诉其他人)它应该这样做。我就是想不通
struct Point
{
int x{ 0 }, y{ 0 };
Point(){}
Point(const int x, const int y) : x{x}, y{y} {}
};
struct Line
{
Point *start, *end;
Line(Point* const start, Point* const end)
: start(start), end(end)
{
}
Line()
{
}
~Line()
{
delete start;
delete end;
}
Line& deep_copy() const
{
Point *cstart=new Point;
Point *cend=new Point;
(*cstart)=*start;
(*cend)=*end;
static Line copy{cstart, cend};
return copy;
}
};
#include <iostream>
using namespace std;
int main (){
Point *start= new Point(1,2);
Point *end = new Point(3,4);
Line line{start, end}, copy;
cout << line.start->x <<endl<< line.start->y <<endl<< line.end->x <<endl<< line.end->y <<endl;
copy = line.deep_copy();
cout << copy.start->x <<endl<< copy.start->y <<endl<< copy.end->x <<endl<< copy.end->y <<endl;
return 0;
}
当 运行 时,您的程序将创建 3 Line
个对象:
line
in main(以下用main::line
表示)
copy
in main(以下用main::copy
表示)
copy
in deep_copy(以下用 deep_copy::copy
表示)
由于deep_copy::copy
是一个static对象,它在创建后一直保留在内存中,直到程序结束运行。
相应地,您的程序将有 3 个析构函数调用(属于 Line
结构对象)。前两个用于 main::copy
和 main::line
。第三次析构函数调用将用于程序 运行 末尾的 deep_copy::copy
。请注意,main::copy
和 deep_copy::copy
的指针(start
和 end
)指向相同的位置,因为这两个对象是彼此的副本。因此,在第三次析构函数调用期间(针对 deep_copy::copy
),deep_copy::copy
的 start
和 end
指向的内存已经被前一个析构函数调用释放 main::copy
.
这会导致 运行时间错误:free(): double free detected in tcache 2
,因为您的程序试图释放已经释放的内存位置。
所以我不得不为 Udemy 的课程做这个练习,我完成了它。但是 运行 在我自己的 GDB 机器上,我得到了上面标题中的错误。我尝试检查销毁前后指针的值,并且 start 的值在析构函数的行和复制(都在 main 的范围内)上表现异常 在第一次调用析构函数时我无法访问开始和破坏后 start->x 的值(它正常打印)为零(预期)但在第二个析构函数中,应该为 3 的 start->x 的值也为零。但是我的代码中没有任何内容告诉我(它可能会告诉其他人)它应该这样做。我就是想不通
struct Point
{
int x{ 0 }, y{ 0 };
Point(){}
Point(const int x, const int y) : x{x}, y{y} {}
};
struct Line
{
Point *start, *end;
Line(Point* const start, Point* const end)
: start(start), end(end)
{
}
Line()
{
}
~Line()
{
delete start;
delete end;
}
Line& deep_copy() const
{
Point *cstart=new Point;
Point *cend=new Point;
(*cstart)=*start;
(*cend)=*end;
static Line copy{cstart, cend};
return copy;
}
};
#include <iostream>
using namespace std;
int main (){
Point *start= new Point(1,2);
Point *end = new Point(3,4);
Line line{start, end}, copy;
cout << line.start->x <<endl<< line.start->y <<endl<< line.end->x <<endl<< line.end->y <<endl;
copy = line.deep_copy();
cout << copy.start->x <<endl<< copy.start->y <<endl<< copy.end->x <<endl<< copy.end->y <<endl;
return 0;
}
当 运行 时,您的程序将创建 3 Line
个对象:
line
in main(以下用main::line
表示)copy
in main(以下用main::copy
表示)copy
in deep_copy(以下用deep_copy::copy
表示)
由于deep_copy::copy
是一个static对象,它在创建后一直保留在内存中,直到程序结束运行。
相应地,您的程序将有 3 个析构函数调用(属于 Line
结构对象)。前两个用于 main::copy
和 main::line
。第三次析构函数调用将用于程序 运行 末尾的 deep_copy::copy
。请注意,main::copy
和 deep_copy::copy
的指针(start
和 end
)指向相同的位置,因为这两个对象是彼此的副本。因此,在第三次析构函数调用期间(针对 deep_copy::copy
),deep_copy::copy
的 start
和 end
指向的内存已经被前一个析构函数调用释放 main::copy
.
这会导致 运行时间错误:free(): double free detected in tcache 2
,因为您的程序试图释放已经释放的内存位置。