我有一个类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。
答案 0 :(得分:2)
因为第一个模板参数是CacheRef(而不是CacheRef的引用或指针),所以在执行插入时ref将被复制到地图中。因此,您不会存储对本地堆栈变量的引用。
只要CacheRef有适当的复制构造函数或赋值运算符,那么这将正常工作。
答案 1 :(得分:0)
正如Stephen Doyle指出的那样,您实际上是在地图中存储CacheRef
的副本,而不是对传递给cacheData()
方法的副本的引用。
这是否会导致问题取决于CacheRef
类的定义。例如,如果CacheRef
持有指针或对传递给构造函数的Key
的引用,那么一旦Message
实例被销毁,您将得到一个无效指针。
顺便说一下,由于您要在CacheDir
中存储动态分配的Cache::m_dirs
对象,因此您应该确保delete
Cache::~Cache()
析构函数中地图中的所有值避免内存泄漏。