2017-06-14 252 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>