c++ - 尝试在同一类中创建类向量时出现错误
问题描述
我正在尝试用同一类的后代创建一个类,以制作一棵树,但是当我尝试访问向量内部的某些东西时,它永远不会起作用。尝试访问字符串时出现异常: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
将在迭代结束时不再存在,并且您将其地址插入向量中。当您访问它时,您正在访问一个悬空指针,这是未定义的行为,您的程序可能会崩溃、产生垃圾或介于两者之间的任何东西。
您可以使用 Oblivion 建议的堆分配,但在这种情况下,您可能需要考虑使用智能指针进行内存管理。
否则,您可以使用std::vector<A>
C++17 中的值向量而不是指针(有关更多详细信息,请参阅:如何声明同一类的成员向量?)
编辑:我std::vector<A>
在 Chipster 的评论之后澄清了使用。
推荐阅读
- python - 使用 pip 将所有 python2 包迁移到 python3
- python - 如何导入内置模块而不是当前文件夹中的同名自定义模块?
- database - 面向服务的架构:跨不同数据库的外键
- python - 如何将字符串数组输出到 Python 中的文件
- yarnpkg - 如何安装没有符号链接的纱线工作区包?
- c# - 更新 Azure DevOps REST API 中测试结果的生成参考
- java - GlobalExceptionHandler 总是返回 500
- gnuplot - 为什么 GNUPlot 不绘制适合我数据集中点的趋势线?
- java - 跨窗口复制数据以填充不定数量的点
- swift - Struct Memberwise Initialization - 省略具有默认值的属性的值