我是 C++ 的新手,所以请多多包涵。
我会尽量简单地解释我的问题。
我认为下面的代码足够简单易懂。我有一个对象 DF_XML_Table,它有一个字段“名称”。我正在创建对象的实例并将值分配给名称字段。这会导致名称字段为空。
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 =
最佳答案
Why is this the output?
tbl[0]->name =
因为
DF_XML_Table xmlTbl;
超出范围并将在每次循环迭代时被销毁。您将留下一个悬挂指针,稍后访问它是 Undefined Behaviour .
而不是使用原始指针,你应该选择一个合适的 dynamic memory management智能指针存储在 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
结束他们的生命。超出范围。
关于c++ - 在循环内填充 C++ 对象字段会导致空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31034197/