You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:36:01