2017-06-14 23 views
-1

このコードにランタイムエラーがある理由を教えてください。 addEmployee()関数が問題だと思います。 C++ - ランタイムエラー:ベクトル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); 
} 

I機能を変更する場合

(addEmployee())以下に示すように、しないエラー。 しかし、 "push_back(従業員)"を使用すると実行時エラーが発生する理由を知りたいのですが。

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

私はDev-C++を使います。バージョン5.11 – doubleU

+0

あなたの問題ではありませんが、 'Manager'のデフォルトのコピーコンストラクタは_pointers_を' group'にコピーします。それは '〜Manager'がそれらを2回削除するので、悪いことです。解決策: 'Manager(Manager const&)= delete'はそのデフォルトコピーctorを削除します。 – MSalters

答えて

0

最初のバージョンの問題は、クラッシュしたことを、あなたはローカル変数、コンパイラは用のストレージを管理していること、すなわちオブジェクトへのポインタを追加することです。つまり、Managerが破壊されると、deleteというオブジェクト、つまり割り当てられていないオブジェクトであるnewが試されます。

deleteあなたはnew(とdelete[]あなたはnew[]です)!

実際、ポインタを持つ理由はありません。代わりに、普通のオブジェクトのベクトル、つまりstd::vector<Employee>を使用します。

関連する問題