C++ 返回映射中对象的值
c++ returning the value of an object inside a map
我的问题是我有一个非常基本的 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)));
}
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用