这是我得到的错误:
======= 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 。 在释放指针之前还要检查指针值。