我有一个抽象类: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.
}
答案 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*
的地图。这会自动为你清理内存。