在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
答案 0 :(得分:0)
别名通过pFI
指针发生。在填充向量的第一个循环中,每个csi
都有一个唯一的pFI
。因此,在排序后使用csi
时,csi.pFI
与向量的最终元素(排序前)相同。
此修复是在更改FI
之前添加另一个pFI
对象并设置其runId
字段:
CFileInfo sentinel; csi.pFI = &sentinel;
这应该是显而易见的,但显然不是!