c++ - 访问冲突读取 - 字符串 vector 指针指向字符串 vector 中的值

标签 c++

我在 C++ 方面不是很有经验的程序员,我有一个我无法解决的问题。我正在从事的项目很大,所以我不能在这里发布所有代码。这是太多的代码和太多的解释。我只写了一小部分代码,这是导致我出现问题的部分,所以我希望它足够了。很抱歉我的问题很长,但我想解释所有已发布的代码。也许这部分代码不足以解决问题,但我想尝试一下。

首先我有一个名为“record”的结构:

struct record {
    vector<string> dataRow;
    vector<string *> keys;
    vector<string *> values;

    void setDataRow(vector<string> r) {
         dataRow = r;
    }
}

一些字符串数据被标记为键,另一些被标记为值。下一个处理对我来说最好是将所有字符串数据放在一个 vector 中,所以这就是为什么我没有两个字符串 vector ( vector 键、 vector 值)的原因。

然后我有这个:

vector< vector<record> > resultSet;

vector 就像数据表 - 一组带有字符串数据的行。我需要这些表的特定计数,因此需要记录 vector 的 vector 。表数是可选的,所以当我设置表数时,我通过保留函数准备表:

resultSet.reserve(count);
for(unsigned int i = 0; i < count; i++) {
    vector<record> vec;
    resultSet.push_back(vec);
}

当我想向结果集添加新记录时,我知道我需要向其中插入记录的表的数量。在 resultSet[number].push_back(rec) 之后,我需要更改 vector “keys”和“values”中的指针,因为 push_back() 在其他内存地址中创建了值为“dataRow”的“rec”的新拷贝,对吧?所以我有这个函数可以执行 push_back 和更新指针:

void insert(int part, vector<string> & dataRow) {
    record r;
    r.setDataRow(dataRow);

    resultSet[part].push_back(r);
    int pos = resultSet.size() - 1; // position of last record
    resultSet[part].at(pos).values.clear();
    resultSet[part].at(pos).keys.clear();

    for(unsigned int i = 0; i < dataRow.size(); i++) {
        record * newRec = &resultSet[part].at(pos);
        if(isValue(dataRow[i])) {
            newRec->values.push_back(&(newRec->dataRow.at(i)));
            // control cout...
        } else {
            newRec->keys.push_back(&(newRec->dataRow.at(i)));
            // control cout...
        }
    }
}

这是有效的。在 newRec 中的 push_back 之后,我确实控制了插入指针及其引用值的 cout,一切正常。

但是!在一些插入之后,我调用函数 processData(resultSet),它必须处理 resultSet 中的所有数据。在实现处理 od 数据之前,我只想打印所有控制键,以查看是否一切正常。这段代码:

for(unsigned int i = 0; i < resultSet.size(); i++) {
    for(unsigned int j = 0; j < resultSet[i].size(); j++) {
        cout << "keys: ";
        for(unsigned int k = 0; k < resultSet[i].at(j).keys.size(); k++) {
            cout << *resultSet[i].at(j).keys.at(k) << ", ";
        }
        cout << endl;
    }
}

不好(与记录的打印值 vector 相同的问题)。它抛出访问冲突读取异常。我知道当我想读取不可访问的内存时会抛出这个异常,对吧?请告诉我,我在上面编写的代码中有错误,因为我真的不知道为什么它不起作用。在处理 resultSet 之前,除了一些插入计数外,我对 resultSet 什么都不做。

感谢您的阅读和可能的答案。

最佳答案

当您向 std::vector 添加条目时,指向该 vector 中元素的所有现有指针都应被视为无效。

这是出错的代码。

vector<string> dataRow;
vector<string *> keys;
vector<string *> values;

如果 keysvalues 指向 dataRow 中的字符串,它们将在 dataRow 增长时失效。

关于c++ - 访问冲突读取 - 字符串 vector 指针指向字符串 vector 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14693934/

相关文章:

c++ - 需要帮助来理解轮类计算并减少我的代码中的一些脂肪

c++ - 如何使用哈希表在最小堆上实现 O(1) 删除

c++ - 我需要包括什么才能使用 OpenClipboard()?

c++ - 将 multi_key 映射转换为连接多个键的 "normal"映射

c++ - `STRSAFE_NO_TRUNCATION` 和 `STRSAFE_NULL_ON_FAILURE` 值有什么区别?

c++ - 我是否需要在 CUDA 中跨多个 GPU 镜像输入缓冲区/纹理?

c++ - 如何使用 WinAPI 在 Windows 上自定义滚动条

c++ - 我今天应该使用 TCHAR 吗?

c++ - 为什么我的 Arduino 不能超过 10?

c++ - 用于访问和设置值的重载 [] 运算符 (C++)