C ++: Вектор указателей не реагирует на изменения - PullRequest
0 голосов
/ 24 марта 2019

Я новичок в C ++, сейчас я работаю с некоторыми указателями.Допустим, у меня есть вектор указателей, я нажимаю один элемент, называю его k2, а затем делаю указатель k2, указывающий на k3.Это изменение влияет на k2, но не влияет на вектор.Что я должен был сделать, чтобы это изменение повлияло и на вектор?

struct Node
{
    Node()
    {
        visited_print = false;
        visited_find = false;
    }
    bool visited_print;
    bool visited_find;
    int value;
    std::vector<Node*> children;
    Node *parent;
};

int main(){
    Node *k1 = new Node();
    Node *k2 = new Node();
    k2->value = 10;
    Node *k3 = new Node();
    k3->value = 100;
    k1->children.push_back(k2);
    k2 = k3;

}

В приведенном выше примере k1->children[0]->value равно k2->value (10).

Мне нужно, чтобы значение k1->children[0]->value было k3->value (100).

1 Ответ

0 голосов
/ 24 марта 2019

Так не работает. После того, как вы сдвинули назад свой k2, который указывает на некоторую память, которую вы выделили, вы сохранили ее в векторе. Таким образом, у вас есть указатель, указывающий на область памяти, которая имеет 10 в нем. После присвоения k3 k2, вы только изменили переменную-указатель, чтобы указывать на другую ячейку памяти, в которой есть 100. После этого вы даже не удалите k2, вы потеряли указатель на эту память. Это называется утечкой памяти.

Вместо этого вы можете изменить указатель, который вы сохранили в своем векторе. Таким образом, у вас все еще есть доступ к вашим старым данным. Я также не рекомендую перезаписывать этот указатель. Вы не получите доступ к памяти, выделенной для ваших данных.

struct Node
{
    Node()
    {
        visited_print = false;
        visited_find = false;
    }
    bool visited_print;
    bool visited_find;
    int value;
    std::vector<Node*> children;
    Node *parent;
};

int main(){
    Node *k1 = new Node();
    Node *k2 = new Node();
    k2->value = 10;
    Node *k3 = new Node();
    k3->value = 100;
    k1->children.push_back(k2);
    //k2 = k3;

    delete k2;
    k1->children[0] = k3;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...