在循环中填充C++对象字段会导致空字段
Populating C++ object fields inside loop is resulting in empty fields
我对C++还很陌生,所以请耐心等待。
我会尽量简单地解释我的问题。
我认为下面的代码足够简单易懂。我有一个对象DF_XML_Table,它有一个字段"name"。我正在创建对象的实例,并为名称字段指定值。这导致名称字段为空。
vector<DF_XML_Table*> tblVec;
for (int i = 1; i <= 5; i++)
{
string tblName = "Name";
DF_XML_Table xmlTbl;
xmlTbl.name = tblName;
tblVec.push_back(&xmlTbl);
}
cout << "tbl[0]->name = " << tblVec[0]->name << endl;
为什么这是输出?
tbl[0]->name =
为什么这是输出?
tbl[0]->name =
这是因为
DF_XML_Table xmlTbl;
超出范围,并且将在每个循环迭代中被销毁。您将有一个悬空的指针,稍后访问它是"未定义的行为"。
您应该选择一个适当的动态内存管理智能指针来存储在std::vector<>
:中,而不是使用原始指针
vector<std::unique_ptr<DF_XML_Table>> tblVec;
for (int i = 1; i <= 5; i++) {
DF_XML_Table* xmlTbl = ;
tblVec.push_back(std::unique_ptr<DF_XML_Table>(new DF_XML_Table()));
tblVec.back()->name = "Name";
}
cout << "tbl[0]->name = " << tblVec[0]->name << endl;
上面的代码将确保动态分配对象的所有权转移到包含的vector<std::unique_ptr<DF_XML_Table>>
,并得到适当的处理,使其寿命不早于tblVec
超出范围。
这链接到对象的生存期。当您在堆栈上定义xmlTbl时,内存不是在堆上分配的,而是在堆栈上分配的。在for循环的}
大括号之后,指向xmlTbl
(&xmlTbl
)的指针实际上变为无效。
您需要做的是通过使用vector<DF_XML_Table>
(而不是vector<DF_XML_Table*>
)或使用new
来分配内存(但您必须对每个分配的指针调用delete以避免泄漏)来分配这些指针
这是因为您正在创建的xmlTbl
对象只存在于for
的范围内,一旦它退出for
,就会被释放。相反:
vector<std::unique_ptr<DF_XML_Table>> tblVec;
for (int i = 1; i <= 5; i++)
{
string tblName = "Name";
tblVec.push_back( unique_ptr<DF_XML_Table>( new DF_XML_Table ) );
tblVec.back()->name = tblName;
}
cout << "tbl[0]->name = " << tblVec[0]->name << endl;
相关文章:
- 私有字段对象与私有继承?
- 如何正确实例化静态字段 tat 是另一个类对象
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- 对象引用中的字段以不同的方法返回不同的值
- 基于不同字段的对象向量的排序功能
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 如何从对象/类中找到第一个字段?
- 我需要帮助以连续的方式将对象的字段正确写入文件
- 更改保留指向其字段的原始指针的对象地址
- 如何在 c++98 中通过特定字段在 QList 中查找对象?
- 如何从具有多个对象/字段的类中调用方法函数
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 在对象向量中的对象字段排序
- 函数上的关键字'const'意味着对象字段完全只读?
- 类内非静态字段初始化 + 对象池 - >降低可维护性/可读性
- 使用方法影响另一个对象的字段
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- 无法将字段<对象名称>声明为抽象类型
- C++:字段对象可以在不存储指针的情况下知道其"parent"吗?
- 如何指定为成员字段对象调用哪个构造函数