#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. в любом случае было бы немедленно обнаружено во время выполнения.