這是我收到的錯誤:錯誤:*** glibc的檢測到*** W5:雙重釋放或腐敗(fasttop):
======= 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
employee.h 類Employee {
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;
};
employee.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
網上尋找關於這個問題後,我想我有一個「非有效的指針「,但我不知道在哪裏。
如果我使用strcpy()我得到分段錯誤 – hank99
因爲你不分配內存給empName在運算符= – marcinj
我最初說「複製構造函數」,但它實際上是有問題的賦值運算符。如果您先按上面所述分配內存,則不應該出現段錯誤。 –