2017-06-14 89 views
-1

請告訴我爲什麼這段代碼有運行時錯誤的原因。 我認爲addEmployee()函數是問題。C++ - 運行時錯誤:vector push_back()

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 

enum EmployeeLevel {fresh, sophomore, junior, senior}; 

class Employee { 
    string name; 
    EmployeeLevel level; 
public: 
    Employee(const string & _name, const EmployeeLevel _level) 
     : name(_name) { 
     level = _level; 
    } 
    Employee(const Employee & employee) { 
     name = employee.name; 
     level = employee.level; 
    } 
    void changeLevel() { 
     level = static_cast<EmployeeLevel> (level + 1); 
    } 
}; 

class Manager: public Employee { 
    vector<Employee *> group; 
public: 
    Manager(const string & _name, const EmployeeLevel _level) 
     : Employee(_name, _level) {} 
    ~Manager() { 
     for (vector<Employee *>::iterator it = group.begin(); it != group.end(); ++it) 
      delete *it; 
    } 
    void addEmployee(Employee * employee) { 
     group.push_back(employee); 
    } 
}; 

int main(void) 
{ 
    Employee e1("홍", fresh), e2("김", sophomore), e3("차", fresh);  

    Manager m1("Tom", senior); 
    m1.addEmployee(&e1); 
} 

如果我修改函數(addEmployee()),如下所示,不是錯誤。 但我想知道爲什麼使用「push_back(employee)」有運行時錯誤的原因。

void addEmployee(Employee * employee) { 
    Employee * tempEmployee = new Employee(*employee); 
    group.push_back(tempEmployee); 
} 
+0

我使用Dev-C++版本5.11 – doubleU

+0

不是你的問題_now_,但'Manager'的默認拷貝構造函數會複製'group'中的_pointers_。這很糟糕,因爲〜Manager會刪除它們兩次。解決方案:'管理器(經理常量&)=刪除'刪除該默認複製ctor。 – MSalters

回答

0

與第一版本的問題,即崩潰,是你的指針添加到局部變量,即,編譯器管理用於存儲的對象。這意味着當Manager遭到破壞時,它會嘗試delete這個對象,你還沒有分配的對象是new

只有deletenew(和delete[]new[])!

事實上,我沒有理由有一個指針。而是有一個簡單對象的向量,即std::vector<Employee>

相關問題