C++从函数向vector中存储元素的实现方法与问题解析
问题原因
你的问题和堆上分配的Node对象无关,核心是addNode函数的参数传递方式错误:
- 当前定义的
Node *addNode(vector<Node *> list)是值传递,调用函数时会把传入的list2完整拷贝一份,函数内部操作的是这个临时拷贝对象,所有修改完全不会影响到外层的原list2,所以调用三次addNode后list2还是空的。 - 单独打印
node->val正常,是因为你确实在堆上分配了Node内存,这部分内存不会随函数返回释放,所以指针指向的内容是有效的。
解决方法
把addNode的参数改成左值引用传递即可,修改函数签名为:
Node *addNode(vector<Node *> &list)
添加一个&符号后,函数会直接操作传入的原vector对象,不需要生成临时拷贝,push_back的元素会直接写入外层的list2中。
额外优化建议
- 你当前的
printVector也是值传递,调用时会拷贝整个vector,最好也改成const引用传递,避免不必要的性能开销:void printVector(const T &d) - 代码中用
new分配的Node对象没有对应的delete操作,会造成内存泄漏。实际使用时可以遍历vector手动释放所有元素,或者直接用智能指针std::unique_ptr<Node>/std::shared_ptr<Node>代替裸指针,自动管理内存不需要手动释放。
修改后的完整可运行代码示例:
#include <iostream> #include <vector> using namespace std; class Node { public: string val; Node(string value) { this->val = value; } }; // 参数改为引用传递 Node *addNode(vector<Node *> &list) { auto node = new Node("foo"); list.push_back(node); return node; } // 参数改为const引用,避免不必要拷贝 template <typename T> void printVector(const T &d) { cout << "Vector has size " << d.size() << " and elements: "; for (auto p = d.begin(); p < d.end(); p++) { cout << (*p)->val << ","; } cout << "\n"; } int main() { vector<Node *> list1; list1.push_back(new Node("foo")); list1.push_back(new Node("foo")); list1.push_back(new Node("foo")); printVector(list1); vector<Node *> list2; addNode(list2); addNode(list2); auto node = addNode(list2); printVector(list2); // 此时会正确输出 size 3,三个foo cout << node->val << "\n"; // 手动释放内存,避免泄漏 for (auto n : list1) delete n; for (auto n : list2) delete n; return 0; }
内容的提问来源于stack exchange,提问作者thedeg123
相关产品推荐
相关产品推荐

