C ++ struct和std:vector元素之间的别名 - 为什么?

时间:2017-12-04 23:32:03

标签: c++ stdvector

在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

1 个答案:

答案 0 :(得分:0)

别名通过pFI指针发生。在填充向量的第一个循环中,每个csi都有一个唯一的pFI。因此,在排序后使用csi时,csi.pFI与向量的最终元素(排序前)相同。

此修复是在更改FI之前添加另一个pFI对象并设置其runId字段:

CFileInfo sentinel; csi.pFI = &sentinel;

这应该是显而易见的,但显然不是!