C++为什么我的程序在GDB的tcache 2中检测到错误free():double free



所以我不得不在Udemy的一门课程中做这个练习,我已经完成了。但在我自己的GDB机器上运行时,我在标题中出现了上面的错误。我试着检查销毁前后点的指针值,start的值在析构函数上表现得很奇怪,行和副本都在main的范围内。在第一次调用析构函数时,我无法访问start和销毁后的值(它正常打印tho(;x为零(预期(,但在第二个析构函数处,start->本应为3的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;
}

运行时,程序将创建3Line对象:

  • line(以下用main::line表示(
  • copy(以下用main::copy表示(
  • deep_copy中的copy(以下用deep_copy::copy表示(

由于deep_copy::copy是一个静态对象,因此它在创建后一直保留在内存中,直到程序运行结束。

相应地,程序将具有3析构函数调用(属于Line结构对象(。前两个将用于main::copymain::line。第三个析构函数调用将在程序运行结束时用于deep_copy::copy。注意,用于main::copydeep_copy::copy的指针(startend(指向相同的位置,因为这两个对象是彼此的副本。因此,在第三个析构函数调用(用于deep_copy::copy(期间,deep_copy::copystartend所指向的内存已经被main::copy的前一个析构因子调用释放。

这会导致运行时错误:free(): double free detected in tcache 2,因为您的程序试图释放已经释放的内存位置。

最新更新