代码之家  ›  专栏  ›  技术社区  ›  Achraf El Khamsi

C++中的“双自由或CurrUpTUP”错误

c++
  •  -3
  • Achraf El Khamsi  · 技术社区  · 7 年前

    这个问题已经有了答案:

    我有一个名为chaine的类,如下代码所示:

     class Chaine {
      unsigned int _size;
      char* _data;
    
    public:
      Chaine();
      ~Chaine();
      Chaine(const char* str);
      unsigned int size() const;
      char get(unsigned int i);
    };
    

    我已经编写了一个函数,它以chaine为例,不做任何事情(附录)。总的来说,当我调用附件(ch1)时,它给了我一个错误,即“双重自由或腐败(fasttop)”。呼叫附件(CH2)工作正常。如果我在引用一个实例时使用了annex函数,它是有效的,但我不明白为什么。

    void annexe(Chaine s) {
    }
    
    int main() {
      Chaine ch1("Achraf");
      Chaine *ch2 = new Chaine("AchrafA");
      printf("%d\n", ch1.size());
      printf("%d\n", ch2->size());
    
      annexe(ch1);
      annexe(*ch2);
    
      delete ch2;
      return 0;
    }
    

    我的施工人员和描述人员如下:

    Chaine::Chaine() {
      _size = 0;
      _data = NULL;
      printf("constructor %s(%d): %s\n", __FILE__,__LINE__,__func__);
    }
    
    Chaine::Chaine(const char* str) {
      _size = strlen(str);
      _data = new char[_size+1];
      strcpy(_data, str);
    }
    
    Chaine::~Chaine() {
      if (_data != NULL) {
        delete[] _data;
      }
      printf("destructor %s(%d): %s\n", __FILE__,__LINE__,__func__);
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Aganju    7 年前
    1. 你的功能 annexe 采取了 Chaine 作为参数,将 复制的 调用时(没有将参数声明为引用)。
    2. 您没有定义 复制构造函数 为班级 查恩 ,因此将使用默认值。它对所有数据(包括指针)执行基本的按位拷贝 *_data 在你的内心 查恩 .
    3. 当函数结束时,将销毁副本,并销毁后面的相应数据(的副本) *data 在你的析构函数中被释放。
    4. 稍后,您将发布 **数据 ,这是双重删除。