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::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,因为您的程序试图释放已经释放的内存位置。