C++ 返回映射中对象的值

c++ returning the value of an object inside a map

本文关键字:对象 返回 映射 C++      更新时间:2023-10-16

我的问题是我有一个非常基本的 Node 类:

struct Node {
Node* next;
Node* prev;
int value;
int key;
Node(Node* p, Node* n, int k, int val) :prev(p), next(n), key(k), 
value(val) {};
Node(int k, int val) :prev(NULL), next(NULL), key(k), value(val) {};
};

然后是一个缓存类,用于存储 Node 对象的映射

class Cache {
protected:
map<int, Node*> mp; //map the key to the node in the linked list
int cp;  //capacity
Node* tail; // double linked list tail pointer
Node* head; // double linked list head pointer
virtual void set(int, int) = 0; //set function
virtual int get(int) = 0; //get function
};

最后,我有一个从缓存类派生的 LRUCache 类。

class LRUCache : public Cache {
public:
LRUCache(int capacity) { cp = capacity; }
virtual int get(int k) {
std::map<int, Node*>::iterator it;
it = mp.find(k);
if (it != mp.end()) {
return it->second->value;
}
else {
return -1;
}
}
virtual void set(int k, int v) {
if (mp[k]) {
mp[k] = new Node(k, v);
}
else {
std::map<int, Node*>::iterator it = mp.begin();
mp.insert(it, std::pair<int, Node*>(k, new Node(k, v)));
}
}
};

我遇到的错误是在这个 LRUCache 类的获取器上。

返回这个:"返回它->秒>值"给了我这个错误:

LRUCache.exe:0xC0000005:读取路径0x00000008时内存访问冲突。

如果成员值"value"在 Node 结构上是公共的,为什么它会返回错误?

提前致谢

if (mp[k]) {
mp[k] = new Node(k, v);
}
else {
std::map<int, Node*>::iterator it = mp.begin();
mp.insert(it, std::pair<int, Node*>(k, new Node(k, v)));
}

那里有两种可能性。如果k处的映射条目已经存在并引用非空Node,则该Node将被泄漏并替换为另一个Node(这没有什么意义,但至少它不会立即导致崩溃(。

如果映射条目不存在,则mp[k]隐式创建一个,nullptr作为值(也可能它已经存在并持有空指针;最终结果是相同的(。然后,您继续使用相同的密钥k调用mp.insert()- 这不执行任何操作,因为该条目已存在。这里再次泄露了Node- 但主要问题是地图中的空指针。

下次使用相同的键调用get()时,它会检索空指针并立即尝试取消引用它。这就是你的程序崩溃的地方。

谢谢伊戈尔,正如你所说,问题出在二传手上。

这种重构似乎有效:

if (mp.find(k) != mp.end()) {
auto it = mp[k];
it->value = v;
}
else {
auto it = mp.begin(); 
mp.insert(it, std::pair<int, Node*>(k, new Node(k, v)));
}