【问题标题】:executing get function in my class changes values of the class在我的班级中执行 get 函数会更改班级的值
【发布时间】:2021-06-27 16:32:02
【问题描述】:

我一直在尝试重新使用 C++,但遇到了一个我无法解决的问题。在下面的示例中,我创建了一个结构节点和一个类 C。该类包含一个映射。该类有一个 get 和一个 set 函数。我面临的问题是,一旦我执行了 get 函数,节点的值就会改变。下面代码的输出如下:

4
32766
32766

如您所见,一旦我执行 set 函数,值就会发生变化。如果有人知道问题出在哪里,请告诉我。

谢谢。

#include <iostream>
#include <map>

using namespace std;

struct Node {
    int value;
    Node(int v):value(v){};
};

class C {
    public:
        map<int, Node*> m;
        C() {};

        void set(int key, int value) {
            Node n = Node(value);
            m.insert(pair<int,Node*>(key, &n));
        }       

        int get(int key) {
            return m[key]->value;
        }
};

int main() {
    C t = C();

    t.set(1,4);
    cout << t.m[1]->value << endl;
    cout << t.get(1) << endl;
    cout << t.m[1]->value << endl;
}

【问题讨论】:

  • 您的代码有未定义的行为。您正在将一个指向 set 中的对象的指针存储在对函数的调用之外。 m.insert(pair&lt;int,Node*&gt;(key, &amp;n));不好。
  • 你可能只想在这里使用std::map&lt;int, Nome&gt;而不是使用指针。

标签: c++ class pointers


【解决方案1】:

我认为问题出在您的集合实现中。 将其替换为以下代码,它应该可以按预期工作。

    void set(int key, int value) {
        Node *n = new Node (value);
        m.insert(make_pair(key, n)); // or m.insert({key, n});
    } 

【讨论】:

  • 这引入了很多新问题。您现在需要至少提供或删除复制构造函数、复制赋值运算符并提供析构函数。编辑:见What is The Rule of Three?
  • @François Andrieux 建议是解决所提出的问题。您指出的是另一个主题,通过析构函数释放所有分配的内存绝对是一个好习惯。可能需要做的是遍历地图并释放每个元素的第二个元素。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 2011-03-19
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2016-10-07
相关资源
最近更新 更多