7

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

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;
 }
4

2 回答 2

12
  map<string, a> myMap;
  ....
  myMap = new map<string, a>;

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

  myMap = map<string,a>();

复制到默认的初始化myMap映射中。

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

于 2012-06-06T16:47:48.080 回答
3
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++ 中,使数据成员成为值而不是指针或对其他对象的引用更容易。

于 2012-06-06T17:11:23.317 回答