stl::map中的指针

Pointers in stl::map

本文关键字:指针 map stl      更新时间:2023-10-16

我有关于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_ptrstd::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那样实例化它时,它将在堆栈中创建,当程序流超出它创建的作用域时,它将自动销毁。