这在运行时崩溃。
std::map<std::string, MyClass> myMap;
myValue = new MyClass();
myMap["myKey"] = *myValue;
我有2个要求:
为什么我不能在示例中成功使用取消引用运算符?我怎样才能同时完成这两项工作?
PS。我正在使用gcc。
答案 0 :(得分:5)
你可以使用boost或tr1 shared_ptr来代替它:
std::map<std::string, shared_ptr< MyClass > > myMap;
myValue = shared_ptr< MyClass >( new MyClass() );
myMap["myKey"] = myValue;
没有所有权问题,没有内存泄漏。
答案 1 :(得分:4)
如果你失去myValue
的范围,那么就是内存泄漏。因此,最好将MyClass*
存储在地图中。
std::map<std::string, MyClass*> myMap;
myValue = new MyClass();
myMap["myKey"] = myValue;
在给定的示例中,还要确保在从delete
中删除或删除元素时map<>
。如果您不想担心内存管理,可以使用智能指针(例如boost::shared_ptr
)。
另外,从您给出的示例中,我不知道为什么在解除引用*myClass
时它会崩溃。你在复制构造函数MyClass::MyClass(const MyClass&)
中做了一些奇怪的事吗?
答案 2 :(得分:1)
你的最后一行在地图中创建了一个MyClass
的新实例,并在其上调用赋值运算符。我假设您的对象中有一些指针,并且在尝试释放一些内存两次时出现错误。
与Java不同,C ++中没有隐式引用语义;如果你想存储指针,你需要使用std::map<std::string, MyClass*>
并相应地处理内存管理,或者,正如stijn所说,为此使用某种形式的shared_prt
。
答案 3 :(得分:0)
您正在第2行创建一个新对象并/ /将它复制到地图中。您可能正在寻找boost :: ptr_map。