Map值是指向抽象类的指针

时间:2016-12-11 17:11:09

标签: c++ pointers reference stl abstract-class

我有一个抽象类:class Abstract_class {..};

来自派生类的对象:Derived_class Ob;

同样:string name; map<string,Abstract_class*>mp;

如何做到这样的事情:mp[name]=&Ob;正确吗?

编辑:这是一个例子

Abstract_class {..};

int main(){

    map<string,Abstract_class*>mp;

    for(int i=0;i<n;i++){
        int a,b,c; cin>>a>>b>>c;
        Derived_class Ob(a,b,c);
        string name; cin>>name;
        mp[name]=&Ob;
    }

    string s; cin>>s;
    Abstract_class* ptr=mp[s];
    ptr->Print(); // segmentation fault (core dumped)
    //Note: Print() is virtual function.
}

1 个答案:

答案 0 :(得分:0)

您的代码中的问题就在这里:

for(int i=0;i<n;i++){
    int a,b,c; cin>>a>>b>>c;
    Derived_class Ob(a,b,c); // Oops!
    string name; cin>>name;
    mp[name]=&Ob;
}

您已将Derived_class声明为此for循环内的局部变量。这意味着只要当前for循环迭代正在运行,对象Ob才会存在。一旦循环迭代结束,Ob的生命周期结束,对象就不再存在,现在你的地图中有一个指向死对象的指针。那不好!

要解决此问题,请动态分配对象:

for(int i=0;i<n;i++){
    int a,b,c; cin>>a>>b>>c;
    Derived_class* Ob = new Derived_class(a,b,c); // Yay!
    string name; cin>>name;
    mp[name]=Ob;
}

好消息是这个问题与多态或抽象类或类似的东西无关。这只是一个简单而简单的指针问题。

为防止内存泄漏,您可能需要考虑使用其值类型类似于shared_ptr<Abstract_class>unique_ptr<Abstract_class>而非Abstract_class*的地图。这会自动为你清理内存。