2014-02-17 82 views
0

這是我收到的錯誤:錯誤:*** 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 網上尋找關於這個問題後,我想我有一個「非有效的指針「,但我不知道在哪裏。

回答

1

一個問題,我看到的是你的賦值操作符:

// 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剛分配到自sourcesource分配將刪除此內存時,調用析構函數的內存。您應該分配的字符串新內存,然後拷貝到:

// 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); 
} 
+0

如果我使用strcpy()我得到分段錯誤 – hank99

+0

因爲你不分配內存給empName在運算符= – marcinj

+0

我最初說「複製構造函數」,但它實際上是有問題的賦值運算符。如果您先按上面所述分配內存,則不應該出現段錯誤。 –

1

改回的strcpy:

empName = source.empName; 

否則你是雙釋放這個指針

而且你的拷貝構造函數正確地分配內存,而運營商=沒有。

0

在我們應該創建所有的指針的副本拷貝構造函數。

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。內存也被泄露。

在賦值opertor中也有同樣的問題。在分配內存之後,不要分配指針來執行strcpy或memcpy。釋放它之前也檢查指針值。

相關問題