问题描述
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
对象和很快。我的理解正确吗?如果是这样,为什么编译器不为此给出警告或错误?
解决方法
是的,你的理解是正确的。
为什么编译器不会为此给出警告或错误?
你的代码是语法正确的 C++ 代码,所以错误是不可能的。
要对此发出警告,编译器必须检测到问题。由于分配隐藏在几个抽象层中,因此很难设计和实现能够可靠地检测这种情况的算法。也不值得这样做,因为它会 1. 是非常罕见的情况 2. 无论如何都会在运行时立即检测到。