首页 > 解决方案 > 尝试在同一类中创建类向量时出现错误

问题描述

我正在尝试用同一类的后代创建一个类,以制作一棵树,但是当我尝试访问向量内部的某些东西时,它永远不会起作用。尝试访问字符串时出现异常:std::length_error。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class A {
  public:
  string name;
  vector<A*> children;
};

int main()
{
    A cl;
    cl.name= "HI!";
    for(int i = 0; i < 10;i++) {
        A newCl;
        newCl.name= "World!";
        cl.children.push_back(&newCl);
    }

    for(int i = 0; i < 10;i++) {
        // error here:
        cout << cl.children[i]->name << endl;
    }

    return 0;
}

有谁知道用 C++ 制作树的更简单方法,或者如何解决这个问题?

标签: c++visual-c++stdvector

解决方案


问题出在这个循环中

for(int i = 0; i < 10;i++) {
        A newCl;
        newCl.name= "World!";
        cl.children.push_back(&newCl);
}

该变量newCl将在迭代结束时不再存在,并且您将其地址插入向量中。当您访问它时,您正在访问一个悬空指针,这是未定义的行为,您的程序可能会崩溃、产生垃圾或介于两者之间的任何东西。

您可以使用 Oblivion 建议的堆分配,但在这种情况下,您可能需要考虑使用智能指针进行内存管理。

否则,您可以使用std::vector<A>C++17 中的值向量而不是指针(有关更多详细信息,请参阅:如何声明同一类的成员向量?

编辑:我std::vector<A>在 Chipster 的评论之后澄清了使用。


推荐阅读