【发布时间】:2020-11-08 04:16:15
【问题描述】:
我正在尝试编写将向量转换为树的代码,但出现错误:
Line 51: Char 27: runtime error: member access within misaligned address 0xbebebebebebebebe for type 'TreeNode', which requires 8 byte alignment (solution.cpp)
0xbebebebebebebebe: note: pointer points here
<memory cannot be printed>
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:56:27
TreeNode* deserialize(vector<string> v) {
int i=0;
TreeNode* root = new TreeNode(stoi(v[i]));
queue<TreeNode*> q;
q.push(root);
v.erase(v.begin());
while(v.size()>0)
{
if(v[0]==",")
{
q.front()->left=NULL;
q.pop();
v.erase(v.begin());
}
else
{
// TreeNode* root2 = new TreeNode(stoi(v[0]));
q.front()->left->val=stoi(v[0]);
q.push( q.front()->left);
q.pop();
v.erase(v.begin());
}
return root;
}
【问题讨论】:
-
0xbebebebebebebebe表示指针从未初始化。 -
如果您使用调试器,您可能会发现,在某些时候,
q会因任何原因变为空,因此q.front()会导致demons flying out of your nose。显示的代码无法检查q中是否有任何内容,并在访问q.front() 之前相信它。你永远不应该假设 C++ 中的任何东西。 -
当您看到此错误时,提供
v的内容会有所帮助。或者只是使用已经建议的调试器。 -
看来逻辑错了。不管
v的内容是什么,队列永远不会超过1。如果v中有两个或更多逗号,它肯定会崩溃(我的意思是,调用未定义的行为)。 -
您永远不会将任何东西的
left(或right)设置为任何有意义的东西。树中的每个节点都应该有一个new TreeNode。
标签: c++