c++ - 在循环内填充 C++ 对象字段会导致空字段

标签 c++ pointers object

我是 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/

相关文章:

c - 什么情况下数组会衰减为指针?

javascript - 如何使用默认值解构具有空值的嵌套对象

javascript - 通过 Node Express 将对象作为字符串而不是 JSON 发送

javascript - 通过 HTML 表单字段名称获取具有内部对象的 JSON 对象的值,无需 eval

c++ - 我怎么知道一个项目是不是MFC应用程序

c++ - Qt 插槽和信号 : no matching function in MainWindow

c++ - 在局部函数中分配和初始化指针

c++ - 如何将源代码附加到 Eclipse 中的预构建静态 C 库

c++ - 假设所有 Windows 平台都在 UCS-2 LE 中是否安全

c# - C++/CLI 双指针类型转换为 ref IntPtr 以进行 C# 访问