[英]Aliasing between C++ struct and std:vector element--why?
在C ++中, csi
是具有整数字段的结构:
struct CentScanInfo
{
int runId;
...
};
以下代码处理csi
结构的向量:
// Create vector of csi structures
CentScanInfo csi; std::vector<CentScanInfo> csiv;
for(j = 0; j < n; j++)
{
// ... code to store values into a csi structure
csiv.push_back(csi);
}
// Sort the vector, then process entries
if(csiv.size() > 0)
{
sort(csiv.begin(), csiv.end(), CsiSortCriterion);
// BEFORE: csiv[n-2] = 3605406551, which is correct
csi.pFI->runId = -99;
// AFTER: csiv[n-2] = -99, which is wrong
...
}
我不希望更改变量csi
会影响向量csiv
任何元素。 为什么会发生这种情况,以及应该如何更改代码以使其不发生?
Visual Studio 2017 15.4.5; 64位Windows 7 Pro
别名是通过pFI
指针进行的。 在填充了向量的第一个循环中,每个csi
都有一个唯一的pFI
。 因此,在排序之后使用csi
时, csi.pFI
与向量的最终元素相同(排序之前)。
解决方法是在更改runId
之前添加另一个FI
对象并设置其pFI
字段:
CFileInfo sentinel; csi.pFI = &sentinel;
这本来应该很明显,但事实并非如此!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.