LeetCode 297题:返回结构体指针遇栈相关错误求助
问题分析与解决
第一个错误:stack use after scope
你代码里的TreeNode r(data[0] - '0')是栈上的局部变量,函数deserialize执行完毕后,函数的栈帧会被销毁,这个变量占用的内存会被系统回收或重新使用。你返回它的指针&r,后续代码访问这个指针时,就会指向一块已经无效的内存,所以触发了这个错误。
正确的解决方式:用动态内存分配
要让返回的指针指向有效的内存,必须在堆上创建TreeNode对象,用new关键字分配内存:
TreeNode* deserialize(string data) { if (data.empty()) return nullptr; // 必须处理空输入的边界情况 TreeNode* root = new TreeNode(data[0] - '0'); // 这里补充后续的反序列化逻辑(比如处理左右子树的构建) return root; }
用new创建的对象存放在堆内存中,函数返回后不会被销毁,指针始终有效。LeetCode的测试框架会自动负责回收这些堆内存,不用你手动调用delete。
第二个错误:stack buffer overflow(将root设为类成员变量)
把root设为类成员变量的思路本身就有问题:反序列化每次都需要生成全新的树节点结构,复用成员变量会导致内存地址重复覆盖、递归时的栈溢出(比如多次递归调用时反复修改同一个变量,引发内存越界)。这种做法完全没必要,用堆分配的方式就能彻底解决问题。
内容的提问来源于stack exchange,提问作者user010101
相关产品推荐
相关产品推荐

