【问题标题】:Correct way to initialize a map and delete in C++在 C++ 中初始化映射和删除的正确方法
【发布时间】:2012-06-10 17:20:29
【问题描述】:

我正在尝试创建在我的类的构造函数中声明的静态映射。 该映射将在一种方法中初始化并填充数据,并在另一种方法中释放。 这是正确的做法吗?

using namespace std;
#include <map>

struct a {
     string b;
     string c;
}

class aClass:public myClass
 {
 public:
      aClass();
      virtual ~aClass();

 private: 
      map<string, a> myMap;
      void method(int a);
      void amethod(int b);
 }
 void aClass::method(int a)
 {
      myMap = new map<string, a>;
      // Addition of elements;
 }
 void aClass::amethod(int b)
 {
      // retrival of elements
      myMap.clear();
      delete myMap;
 }

【问题讨论】:

  • 在您的代码中,myMap 不是 static。您所说的“静态”究竟是什么意思?
  • 为什么您认为您需要新建地图并稍后将其删除?只需按值保存一个映射,并在适当的时间对其调用 clear()。
  • 我怀疑您是否打算包含 [sli] 标签。我编辑了您的帖子,改为包含 [stl] 标签。

标签: c++ data-structures stl map


【解决方案1】:
  map<string, a> myMap;
  ....
  myMap = new map<string, a>;

这里myMap不是指针,所以用new初始化是不正确的。也许您正在寻找:

  myMap = map<string,a>();

复制到myMap一个默认初始化映射。

请注意,您不需要(实际上也不需要)delete myMap,因为它不是指针。它是一个成员变量,当你的类被销毁时,编译器会自动销毁它。

【讨论】:

  • @snihalani:你不释放它,它不是指针……也许你只想把myMap改成map&lt;string,a&gt;*
  • @snihalani 你不释放它,当包含 aClass 被销毁时,C++ 会释放它
  • 这个会被多次使用,大概200次左右,这段代码的正确性没有问题吧?
  • @snihalani:没有问题,但是在method 中重新初始化地图似乎没有意义,因为它大概已经被清理了。
【解决方案2】:
void aClass::method(int a)
{
  myMap.clear();  // ensure it starts off empty
  // Addition of elements;
}
void aClass::amethod(int b)
{
  // retrival of elements
  myMap.clear();  // maybe not necessary
}

对象myMap 已存在于aClass 的实例中,并在构造其包含实例时构造。您不需要使用new 来创建它,这是 Java 和 C# 的一项功能,其中变量只是对堆上某个实例的引用,并且所有内容都被垃圾收集。在 C++ 中,使数据成员成为值而不是指针或对其他对象的引用更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2019-10-24
    • 2019-10-03
    相关资源
    最近更新 更多