在std :: map中存储局部变量

时间:2011-01-05 14:49:20

标签: c++

我有一个类Message和一个类Cache。 在Message :: processMessage()fn中。我创建了另一个类CacheRef的实例(下面没有显示。) 然后我调用Cache :: cacheData(cacheRef)

现在,在Cache类中,我有一个映射,其密钥为CacheReference。我存储我传递给cacheData fn的引用。在这张地图上。

class Message
{
private:
Key m_key;

public:
  void processMessage(int a, int b, Cache *pCache)
   {
      CacheRef ref(a, b, m_key); //CacheRef is a class defined in same file
      //some char *data - do processing an dfill it!!
      pCache->cacheData(ref, data);

    }

}

class Cache
{
  public:
   void cacheData(CacheRef &ref, const char* data)
   {
     CacheDir *dir;
     std::map<<CacheRef, CacheDir*>::iterator it = m_dirs.find(ref);

      if(it == m_dirs.end())
     {
        dir = new CacheDir();
        m_dirs.insert(ref, dir);

      }
    }

    std::map<CacheRef, CacheDir*> m_dirs; //CacheDir is some class defined in the same file
}

现在,代码工作正常。但我有这个问题(不确定!!)我在map中存储了一些局部变量,一旦processMessage()fn就停止存在。退出。所以,我是否访问了一些无效的内存,这只是运气,这段代码正在运行。

如果这是错误的,实现此行为的最佳方法是什么? 我的系统没有增强功能,因此无法使用shared_ptr。

2 个答案:

答案 0 :(得分:2)

因为第一个模板参数是CacheRef(而不是CacheRef的引用或指针),所以在执行插入时ref将被复制到地图中。因此,您不会存储对本地堆栈变量的引用。

只要CacheRef有适当的复制构造函数或赋值运算符,那么这将正常工作。

答案 1 :(得分:0)

正如Stephen Doyle指出的那样,您实际上是在地图中存储CacheRef的副本,而不是对传递给cacheData()方法的副本的引用。

这是否会导致问题取决于CacheRef类的定义。例如,如果CacheRef持有指针或对传递给构造函数的Key的引用,那么一旦Message实例被销毁,您将得到一个无效指针。

顺便说一下,由于您要在CacheDir中存储动态分配的Cache::m_dirs对象,因此您应该确保delete Cache::~Cache()析构函数中地图中的所有值避免内存泄漏。