0

所以我不得不为 Udemy 的一门课程做这个练习,我完成了它。但是在 GDB 中我自己的机器上运行时,我在标题中得到了上面的错误。我尝试检查破坏前后点的指针的值,并且 start 的值在 line 和 copy 的析构函数上表现得很奇怪(都在 main 的范围内)在第一次调用我无法访问的析构函数时start 和销毁后 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;
}
4

1 回答 1

2

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

  • line主要(以下用 表示main::line
  • copy主要(以下用 表示main::copy
  • copy在 deep_copy 中(以下用 表示deep_copy::copy

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

相应地,您的程序将有3 个析构函数调用(与Line结构对象有关)。前两个将是 formain::copymain::line。第三个析构函数调用将deep_copy::copy在程序运行结束时进行。请注意, 和 的指针(和startend指向相同的位置,因为这两个对象是彼此的副本。因此,在第三次析构函数调用期间(意味着 for ),由和of指向的内存已经被前一个析构函数调用 for 释放。main::copydeep_copy::copydeep_copy::copystartenddeep_copy::copymain::copy

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

于 2021-06-26T07:35:15.323 回答