【发布时间】:2016-02-25 21:58:15
【问题描述】:
编辑:由于我发布了一个没有源代码的 TArray 的不当问题,因此我将其替换为 std::vector。
我在主函数中定义了一个动态数组
std::vector<sSymbols> arrSymbols;
我还有一个向数组添加新元素的函数;
functionOne(std::vector<TSymbols>& arrSymbolsRef)
{
sSymbols symbolOne;
//some symbol struct filling
arrSymbolsRef.push_back(symbolOne);
for (int i = 0; i < arrSymbolsRef.size(); i++)
printf("arrSymbolsRef[%d] ptr is %d", i, &arrSymbolsRef[i]);
}
更新结果: 在循环中运行这个函数会得到这个结果:
arrSymbolsRef[0] ptr is -1242393600
arrSymbolsRef[0] ptr is -1257218304
arrSymbolsRef[1] ptr is -1257218244
New iteration
arrSymbolsRef[0] ptr is -1451463936
arrSymbolsRef[1] ptr is -1451463876
arrSymbolsRef[2] ptr is -1451463816
New iteration
arrSymbolsRef[0] ptr is -1450359040
arrSymbolsRef[1] ptr is -1450358980
arrSymbolsRef[2] ptr is -1450358920
arrSymbolsRef[3] ptr is -1450358860
New iteration
arrSymbolsRef[0] ptr is -1243432448
arrSymbolsRef[1] ptr is -1243432388
arrSymbolsRef[2] ptr is -1243432328
arrSymbolsRef[3] ptr is -1243432268
arrSymbolsRef[4] ptr is -1243432208
New iteration
arrSymbolsRef[0] ptr is -1243432448
arrSymbolsRef[1] ptr is -1243432388
arrSymbolsRef[2] ptr is -1243432328
arrSymbolsRef[3] ptr is -1243432268
arrSymbolsRef[4] ptr is -1243432208
arrSymbolsRef[5] ptr is -1243432148
New iteration
arrSymbolsRef[0] ptr is -1550211968
arrSymbolsRef[1] ptr is -1550211908
arrSymbolsRef[2] ptr is -1550211848
arrSymbolsRef[3] ptr is -1550211788
arrSymbolsRef[4] ptr is -1550211728
arrSymbolsRef[5] ptr is -1550211668
arrSymbolsRef[6] ptr is -1550211608
为什么有时地址会发生变化?
我需要创建一个指向这些元素的指针数组,并在每次增加 arrSymbols 时添加新元素(指针)。
但是经过几次迭代后,数组中的指针指向了错误的数据。
【问题讨论】:
-
很难说没有看到
TArray的来源,但似乎这个类会自动将它当前保存的数据重新定位到其他位置。 -
您的
TArray很可能不得不搬迁,因为它试图保持项目连续,并且无法在其旧地址这样做。在这种情况下,将指针存储到数组中是完全不安全的。 -
这个问题取决于
TArray是什么。那是你自己写的课吗?如果是这样,将有助于显示它的源代码。如果是其他人的,那么至少链接到它的文档 -
您的代码具有未定义的行为,因为
%d表示您承诺传递int,而不是TSymbols*。 -
魔法。这是我能在这里给出的唯一诚实的答案。我们应该如何知道您的
TArray在做什么?哦,等等,我还有一个给你:“通过电”。