C++ C++;用于删除指针的映射和向量中的指针值的通用代码

C++ C++;用于删除指针的映射和向量中的指针值的通用代码,c++,C++,我有一些用于删除向量或映射值中的指针的通用代码 有没有更好的方法(不使用共享PTR或任何tr1扩展) 代码是否正确 这是我的密码: 我有一个名称空间 #ifndef CONTAINERDELETE_H #define CONTAINERDELETE_H #include <functional> #include <map> #include <vector> #include <algorithm> namspace ContainerDe

我有一些用于删除向量或映射值中的指针的通用代码

有没有更好的方法(不使用共享PTR或任何tr1扩展)

代码是否正确

这是我的密码:

我有一个名称空间

#ifndef CONTAINERDELETE_H
#define CONTAINERDELETE_H

#include <functional>
#include <map>
#include <vector>
#include <algorithm>


namspace ContainerDelete{

  template<class A, class B>
    struct DeleteMap
    {
      bool operator()( pair<A,B> &x) const
      {

        delete x.second;
        return true;
      }
    };

   template<class T>
    struct DeleteVector
    {
      bool operator()(T &x) const
        { 
          delete x;
          return true;
        }
    };
 }
 #endif
\ifndef CONTAINERDELETE\u H
#定义CONTAINERDELETE_H
#包括
#包括
#包括
#包括
太空集装箱{
模板
结构删除映射
{
布尔运算符()(对和x)常量
{
删除x.second;
返回true;
}
};
模板
结构删除向量
{
布尔运算符()(T&x)常量
{ 
删除x;
返回true;
}
};
}
#恩迪夫
然后我会在一些代码中使用这个名称空间来删除一个映射或向量

测试映射删除

#include "ContainerDelete.h"

using namespace std;

// Test function.
void TestMapDeletion()
{
   // Add 10 string to map.
   map<int,B*> testMap;
   for( int Idx = 0; Idx < 10; ++Idx )
   {
     testMap[Idx] = new B();
   }

   // Now delete the map in a single  line.
   for_each( testMap.begin(),
             testMap.end(),
             ContainerDelete::DeleteMap<int,B*>());
}
#包括“ContainerDelete.h”
使用名称空间std;
//测试功能。
void testmapdelection()
{
//向映射添加10个字符串。
地图测试地图;
对于(int-Idx=0;Idx<10;++Idx)
{
testMap[Idx]=新的B();
}
//现在删除一行中的地图。
对于每个(testMap.begin(),
testMap.end(),
ContainerDelete::DeleteMap());
}
测试向量删除

// Test Function.
void TestVectorDeletion()
{
  // Add 10 string to vector.
  vector<B*> testVector;
  for( int Index = 0; Index < 10; ++Index )
  {
    testVector.push_back( new B());
  }

  // Now delete the vector in a single  line.
  for_each( testVector.begin(),
            testVector.end(),
            ContainerDelete::DeleteVector<B*>());
} 
//测试函数。
void testvectordelection()
{
//向向量添加10个字符串。
向量测试向量;
对于(int索引=0;索引<10;++索引)
{
testVector.push_back(新的B());
}
//现在删除单行中的向量。
对于每个(testVector.begin(),
testVector.end(),
ContainerDelete::DeleteVector());
} 
谢谢


Mike

如果将通用性降低为:

struct DeleteVector
{
    template<class T>  //use the template here!
    void operator()(T &x) const
    { 
      delete x;
    }
};
使用
DeleteVector
时无需传递类型参数,因为它不再是类模板了

类似地,您可以实现
DeleteMap
functor


您还应该将
DeleteVector
重命名为
DeleteT
,将
DeleteMap
重命名为
DeletePairSecond
,因为这两个名称可以更一般地使用。例如,
DeleteT
甚至可以与
std::list
一起使用,也可以与数组一起使用。

代码正常。我无法想象有任何其他方法可以删除指针。您所能做的就是减少显式类型规范,就像上面的问题一样。我知道一种更难看的方法:函数推导其模板参数的类型。因此,您可以使用第一个参数-vector,第二个参数-ptr编写模板函数,然后使用std::bind of vector参数使该函数接受一个参数-ptr。
但是functor更好、更灵活。

shared_ptr现在是标准的(gcc 4.5和VS2010都支持它),但是如果您不想在完全兼容编译器之前使用它,可以使用boost::shared_ptr,这几乎是一样的。我建议不要实现您自己的解决方案,因为有很多棘手的情况(除非您是出于教育目的而这样做的,这很好)。在C++11中,第一次尝试总是使元素类型
std::unique\u ptr
,只有在不符合您的需要时才寻找替代方案。原始指针的容器总是一个坏主意,因为您不知道谁拥有指向对象的指针。您甚至可以混合使用指向动态、静态和自动变量的指针。容器如何能够限制你所能造成的伤害?@KerrekSB我当前代码设置中的主要问题是删除指针的顺序(当我通过引用传递指针时)。我需要确保我从最后一个引用向后工作,这样就不会得到悬空的指针?这是使用共享资源的好地方吗_ptr@MWright例如我不明白。订单有什么关系?指向的对象彼此知道吗?这听起来像是一场维护噩梦…@KerrekSB很抱歉不清楚。我在代码中使用了大量指向指针的指针和指向指针向量的指针。这些对象还通过引用传递给其他类,所以我需要跟踪它们。这些指针是常规指针,而不是智能指针。使用shared_ptr咬构建并重新编码是否符合我的最佳利益,这样我的内存就能得到适当的处理?这看起来确实更干净。我是否不需要在重载运算符()中有一个返回值?但您将其声明为返回bool,应该是void?@BleepBloop:Oops。对那只是个打字错误。我以为我疯了!感谢共享指针可能非常慢。如果不集中复制指针,最好使用它们。
for_each(testVector.begin(),
         testVector.end(),
         ContainerDelete::DeleteVector());