stl::map中的指针
Pointers in stl::map
我有关于std::map的查询。
如果我有一个std::map,比如:
std::map <T1, T2*> my_map;
T1 t;
T2* tt = new T2;
my_map[t]=tt;
负责清理这个容器,T2的析构函数会处理它(T2* tt)。另外,如果我想在整个程序中保留这个容器,我应该在哪里清理它。
谢谢
该映射将销毁存储在该映射中的对象。map存储了一些T1
对象,它们将被销毁;map存储了一些T2
指针,它们将被销毁。
但是不是存储实际的T2
对象。因此没有T2
对象将被破坏。
原始指针对其所指向的对象没有所有权。因此,当指针被销毁时,它不会删除它所指向的任何内容。
一般来说,当你有一个指针时,没有办法知道是否
- 它指向一个有效的对象(你不想在内存中的一些随机垃圾上调用
delete
), - 它指向的对象已经被
new
分配(如果它已经以其他方式分配,它不应该被delete
删除),或者 - 如果有其他指针也指向同一个对象(在这种情况下,只有一个应该调用
delete
。哪一个?)
所以即使你想,也没有办法在对象指针被销毁时自动删除它。
本例中没有调用T2
的析构函数,只销毁了指针。当map超出作用域时,它将销毁所有元素对<T1, T2*>
,但这不会对第二项调用delete
。
如果你想要引用计数指针,你可以使用boost::shared_ptr
或std::shared_ptr
(c++ 11)。
#include <boost/shared_ptr.hpp>
std::map <T1, boost::shared_ptr<T2> > my_map;
T1 t;
T2 *tt = new T2;
my_map[t] = tt; // tt is passed to a shared_ptr, ref count = 1
// when out of scope, the destructor of `boost::shared_ptr` will call `delete`.
如果不需要复制map中存储的对象,可以使用c++ 11的std::unique_ptr
。
Benoit说的话;但作为替代方案,可以考虑boost::ptr_map
;基本上是一个map,它获取所包含的指针值的所有权。
由您决定谁负责清理数据,这取决于您的意图(例如,您的映射可以是一个临时存储,以帮助执行某些算法,并且您希望避免复制)。然而,使用boost::shared_ptr
(或std::tr1::shared_ptr
)通常是很好的方法。
该对象是在堆栈中创建的局部变量(换句话说,不是在堆中)。一旦超出作用域,它将被销毁。
更详细地解释一下,当您使用new
操作符创建对象时,它是在堆中创建的,您必须手动delete
它。当你像AClass a
那样实例化它时,它将在堆栈中创建,当程序流超出它创建的作用域时,它将自动销毁。
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 当 ofstream 指针位于 std::map 中时,文件写入不会发生 C++.
- 将指向结构数组的指针添加到 std::map
- 为什么 map::找不到指向 const 的指针?
- 将字符指针按顺序存储在 map 中 std::map<char*, int> mymap。将其存储为字符或字符串不是一个选项
- 动态创建一个继承的类,使用STD :: MAP使用基类指针访问
- C 设置STD :: MAP值为结构实例的指针
- 指向结构的指针保留某些属性,同时将其他属性重置为零(使用 map)
- 为什么 std:map 不能接受指针作为键值?
- c++ std map 的擦除功能是否释放了指针键的内存?
- 使用MAP指针时运行时错误
- 访问MAP中的第二个元素,这是对象指针
- 新的STD :: MAP条目中指针的默认值
- 重载 map::key_comp,以便我可以在对象指针的地图上使用 map::find
- 在 std::map 中使用提升智能指针
- 使用指针访问 map 中的行数据 C++
- 使用指针从其密钥中访问MAP的值
- 删除指针作为 std::map 的第一个键
- std::map 和函数指针作为具有不同签名的值
- std::map 和函数指针作为值