错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):

Error: *** glibc detected *** w5: double free or corruption (fasttop):

本文关键字:损坏 顶部 检测 glibc w5 错误 释放      更新时间:2023-10-16

这是我得到的错误:

======= Memory map: ========
08048000-0804a000 r-xp 00000000 00:28 2955225621  /home/w5/w5
...more
Aborted
我的

程序编译完美,我的输出的一部分也是正确的。我有 3 个文件,w5.cpp,employee.h,employee.cpp。我需要创建一个复制构造函数、一个赋值运算符和一个析构函数。

W5.cpp(有点大)。http://hostcode.sourceforge.net/view/1435.txt

员工.h 类员工 {

   int empNum;
   char* empName;
   public:
     //Constructor 
      Employee();
      Employee(int num, const char* name);
     //Copy Constructor
      Employee(const  Employee& source);
     //Assignment operator
      Employee& operator=(const Employee& source);
     //Destructor
      ~Employee();
      void display() const;
      bool isGreaterThan(const Employee&) const;
};

员工.cpp

#include <iostream>
using namespace std;
#include "Employee.h"
#include <string.h>
Employee::Employee() {
   empNum = 0;
   empName= nullptr;
}
Employee::Employee(int num, const char* name) {
   if(num < 0 || strcmp(name,"")==0) {
      Employee();
   } 
   else {
      empNum = num;
      empName = new char[strlen(name)+1];
      strcpy(empName, name);
   }
}
Employee::Employee(const Employee& source) {
   cout << "Copy Constructor!"<<endl;
   if(source.empName !=nullptr) {
      empNum = source.empNum;
      empName = new char[strlen(source.empName)+1];
      //strcpy(empName, source.empName);
      empName = source.empName;
   }
   else 
      empName =nullptr;
}
Employee& Employee::operator=(const Employee& source) {
   cout << "Operator Assignment!" <<endl;          
   // check for self-assignment
   if(this != &source) {
       cout << "Operator Assignment 2" <<endl;
      empNum = source.empNum;
      delete [] empName;
      if(source.empName !=nullptr) { 
         empName = source.empName;
         //strcpy(empName, source.empName);
      }
      else
         empName = nullptr;
   }
   return *this;
}
//Destructor
Employee::~Employee() {
   delete [] empName;                     
}
void Employee::display() const {
   cout << empNum << empName <<endl;
}
bool Employee::isGreaterThan(const Employee& source) const {
   return true;
   //still need to code here
}

为了编译它,我使用g++ -std=c++0x -o w5 w5.cpp Employee.cpp在网上查看有关此问题的信息后,我认为我有一个"无效指针",但我不确定在哪里。

我看到的一个问题是你的赋值运算符:

// these two lines should be removed
empNum = source.empNum;
delete [] empName; // this deletes the source's employee name! (bad)
if (source.empName != nullptr) { 
     empName = source.empName;
}

不应只将对象的empName指针分配给source分配的内存,因为调用析构函数时source将删除此内存。您应该为字符串分配新的内存,然后复制到其中:

// first delete our string if we've previously allocated memory for it
if (empName != nullptr) {
    delete [] empName;
    empName = nullptr;
}
// now copy the source's empName
if (source.empName != nullptr) { 
     empName = new char[strlen(source.empName)+1];
     strcpy(empName, source.empName);
}

改回strcpy:

empName = source.empName;

否则,您将双重释放此指针

此外,复制构造函数可以正确分配内存,而运算符=则不会。

在复制构造函数中,我们应该创建所有指针的副本。

Employee::Employee(const Employee& source) {
   cout << "Copy Constructor!"<<endl;
   if(source.empName !=nullptr) {
      empNum = source.empNum;
      empName = new char[strlen(source.empName)+1];
      //strcpy(empName, source.empName);
      empName = source.empName;
   }
   else 
      empName =nullptr;
} 

行 "empName = source.empName;" 将生成对象的 empName 以及指向同一位置的 src 对象的 empName。内存也泄露了.

在赋值操作器中,您也有同样的问题。 不要分配指针 在分配内存后执行 strcpy 或 memcpy 。 在释放指针之前还要检查指针值。