这是我得到的错误:

======= 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

员工
    班级员工{

   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;

};


员工

#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);
}

10-07 19:26