c++ - 尝试在同一类中创建类 vector 时出现错误

标签 c++ visual-c++ stdvector

我正在尝试用同一类的后代创建一个类,以创建一棵树,但是当我尝试访问 vector 内部的某些内容时,它永远无法工作。尝试访问字符串时出现异常: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++ 制作树的更简单方法,或者如何解决这个问题?

最佳答案

问题出在这个循环

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

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

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

否则,您可以获得一个值 vector std::vector<A>而不是指针,可能来自 C++17(有关更多详细信息,请参见:How can I declare a member vector of the same class?)

编辑:我阐明了 std::vector<A> 的用途在 Chipster 的评论之后。

关于c++ - 尝试在同一类中创建类 vector 时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57350317/

相关文章:

C goto 跨越初始化,MinGW-W64 vs MSVC++

c++ - 关于填充 vector 的不同方法

Java 使用数组比 C++ 中的 std::vector 快 8 倍。我做错了什么?

c++ - 将 vector 与包含不可复制数据类型的类一起使用

c++ - 在不复制数据的情况下,决定 what() 从继承自 std::system_error 的类返回什么的符合标准的方法是什么?

c++ - 如何使用 std::find 从 vector< pair < string, string >> 类型的第一个元素中查找字符串?

c++ - 使用鼠标滚轮时如何更新光标?

c++ - 临时实例的生命周期是多长?

c++ - 当我尝试执行任何程序时 Qt 崩溃

c++ - makefile 发布多个定义