Вектор указателей в C ++ - PullRequest
       5

Вектор указателей в C ++

0 голосов
/ 21 февраля 2020

Я новичок в кодировании на C ++ и сталкиваюсь с очень простой c проблемой. Приведенный ниже код является минимальным примером проблемы.

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

Вывод, который я получаю:

121
-500 -500
30 30 30

Требуется вывод :

121
121 -500
121 -500 30

Кажется, это действительно глупо, но я не уверен, как go исправить это! Мы будем благодарны за любую помощь.

#include <iostream>
#include <vector>
#include <array>
#include <iterator>
#include <list>

static std::vector<std::array<int, 2> *> heap_array;

void insert_into_heap(int num){
    static std::array<int, 2> test;
    test[0] = num;
    heap_array.push_back(&test);
}

void print_heap(){
    std::vector<std::array<int, 2> *>::const_iterator it;
    for(it = heap_array.begin(); it != heap_array.end(); ++it){
        std::cout << (*(*it))[0] << " ";
    }
    std::cout << "\n";
}

int main(int argc, char** argv){
    insert_into_heap(121);
    print_heap();
    insert_into_heap(-500);
    print_heap();
    insert_into_heap(30);
    print_heap();
    return 0;
}

Кроме того, именование, связанное с кучей, на данном этапе не имеет значения.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2020

Объяснение

void insert_into_heap(int num){
    static std::array<int, 2> test;
    test[0] = num;
    heap_array.push_back(&test);
}

В этой функции вы объявляете test как stati c, что означает, что он создает этот массив при первом вызове функции и обновляет его только в следующие моменты времени. Когда вы отправляете адрес этого теста в свою кучу, вы фактически каждый раз отправляете один и тот же адрес. Предположим, что адрес этого test был 0x1234 при первом вызове, он останется таким же для всех остальных вызовов. Таким образом, когда вы обновляете каждый раз эту переменную stati c, вы фактически обновляете каждый элемент массива кучи каждый раз (поскольку все они указывают на одно и то же место в памяти).

Как решить?

Есть несколько способов go решить эту проблему. Я бы просто порекомендовал вам использовать smart pointers в вашей heap_array и make_shared / make_unique в вашей insert_into_heap функции, так что вы создадите несколько действительно новых областей памяти в куче.

Список литературы:

Stati c ключевое слово
Smart Pointers

1 голос
/ 21 февраля 2020

В приведенном ниже коде желаемый результат - три разных указателя в векторе.

Это три разных указателя, но все они указывают на один и тот же массив. В вашем коде есть только один массив:

void insert_into_heap(int num){
    static std::array<int, 2> test;      // <-----------
    test[0] = num;
    heap_array.push_back(&test);
}

Однако всякий раз, когда я добавляю указатель на вектор, он перезаписывает все записи вектора, содержащие этот же указатель.

Это не совсем то, что происходит. Вектор heap_array не является проблемой, но test[0] = num; записывает в один и тот же элемент при каждом вызове. И когда вы печатаете, вы печатаете один и тот же массив несколько раз.

Я полагаю, вы объявили test как static, потому что в противном случае указатели, которые вы храните в heap_array, указывают на уже не живые объекты. Однако непонятно, зачем вам указатели на heap_array. Массивы должны где-то жить. Использование функции local static не является решением. Храните объекты вместо указателей, и ваша проблема исчезла.

Мне действительно нужен массив указателей на объекты, а не на реальные объекты. Для более крупного проекта я работаю над

Позвольте мне повторить: массивы должны где-то жить. В основном у вас есть два варианта: либо вы сохраняете фактические объекты в другом контейнере, либо сохраняете умные указатели на динамически размещаемые объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...