почему я не могу прочитать строку * объект - PullRequest
0 голосов
/ 19 марта 2020

Я знаю, что этот вопрос немного странный, но я супер новичок в c ++, поэтому я понятия не имею, о чем мне даже просить, но я пытаюсь реализовать двоичное дерево, и у меня есть эта функция:

std::string* Tree::getChildren(int node) {
    std::string children[2];
    for (int i = 0; i < 2; i++) {
        children[i] = tree[2 * node + i];
    }
    return children;
}

, который я пытаюсь вывести так:

std::string* k = t.getChildren(1);
cout << k[0]<<","<<k[1] << endl;

, но это приводит к ошибке:

Исключение, выданное в 0x6A46F3BE (ucrtbased.dll) в Project1. exe: 0xC0000005: Место чтения нарушения доступа 0x CCCCCCCC. произошло

Что это значит и что мне делать, чтобы его не было?

1 Ответ

0 голосов
/ 19 марта 2020

Это создает локальный массив std::string:

std::string children[2];

Когда функция возвращает, этот массив уничтожается, поэтому возвращаемый вами указатель немедленно становится недействительным.

Лучшая версия будет использовать класс-оболочку для простых массивов std::array:

#include <array>

std::array<std::string,2> Tree::getChildren(int node) {
    std::array<std::string,2> children;
    for (int i = 0; i < 2; i++) {
        children[i] = tree[2 * node + i];
    }
    return children;
}

и использовать его:

auto k = t.getChildren(1);
cout << k[0]<<","<<k[1] << endl;
...