繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM