Приводит ли этот код к бесконечному распределению во время выполнения?

#c #vector

#c #вектор

Вопрос:

 struct trie_node
{
    trie_node() : is_leaf{true}, children(26), c{' '} {};
    bool is_leaf{false};
    std::vector<trie_node> children;
    char c{' '};
};

int main(int argc, char const *argv[])
{
    trie_node t;
}
 

Когда я пытаюсь скомпилировать приведенный выше код, он компилируется правильно. Однако при изучении кода выясняется, что с распределением происходит бесконечный цикл, поскольку переменная-член children является вектором trie_node . Таким образом, при t создании он создаст вектор объектов размером 26 trie_node , и каждый из этих 26 элементов, в свою очередь, создаст другой вектор объектов размером 26 trie_node и так далее. Правильно ли я понимаю? Если да, то почему компилятор не выдает предупреждение или ошибку для этого?

Комментарии:

1. Правильно ли я понимаю? Да. Если да, то почему компилятор не выдает предупреждение или ошибку для этого? Посмотрите на проблему остановки.

2. компиляторы не предназначены для обнаружения логических ошибок в вашем коде

3. Лучше изменить std::vector<trie_node> children на std::vector<std::unique_ptr<trie_node>> children

4. Вы можете вызвать ту же проблему в большинстве других языков — C #, Java, Perl, Python и т.д.

5. @David Указывая на массив, вы не вызываете инициализацию всех элементов массива. Это произойдет только при вызове new . Тогда нет бесконечного выделения цикла.

Ответ №1:

Да, ваше понимание верно.

почему компилятор не выдает предупреждение или ошибку для этого?

Ваш код является синтаксически корректным кодом C , поэтому об ошибке не может быть и речи.

Чтобы выдать предупреждение об этом, компилятор должен был бы обнаружить проблему. Поскольку распределение скрыто в нескольких уровнях абстракции, очень сложно разработать и реализовать алгоритм, который может надежно обнаружить этот сценарий. Кроме того, это того не стоит, так как это было бы 1. очень редким сценарием 2. в любом случае было бы немедленно обнаружено во время выполнения.