首页 > 解决方案 > Visual Studio C++:Vector 标头中的读取访问冲突异常

问题描述

我正在复制 C++ Primer 第 5 版中的 TextQuery 示例。代码可以编译,但在执行 push_back 操作时,它会不断从 Vector 标头抛出“读取访问冲突”。这是我的代码(* 是带有错误的行):

//main.cpp
#include "stdafx.h"
using namespace std;
int main()
{
    ifstream ifile;
    ifile.open("D:/OneDrive/Learning/C++/ConsoleApplication1/ConsoleApplication1/testfile.txt");
    runQueries(ifile); //*
// ...
}

//stdafx.h

#pragma once

#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <vector>
#include <string>
#include <memory>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <sstream>
#include <map>
#include <set>
#include "TextQuery.h"

//TextQuery.h
void runQueries(ifstream &infile)
{
    TextQuery tq(infile); //*
// ...
}

class TextQuery {
public:
    using line_no = std::vector<std::string>::size_type;
    TextQuery(std::ifstream&); //*
// ...
private:
    std::shared_ptr<std::vector<std::string>> file;
    std::map < std::string, std::shared_ptr<std::set<line_no>>> wm;
};

TextQuery::TextQuery(std::ifstream &is)
{
    string text;
    while (getline(is, text)) {
        file->push_back(text); //*
    //...
    }
}

下一次执行将在向量头中引发异常:

bool _Has_unused_capacity() const _NOEXCEPT
    {   // micro-optimization for capacity() != size()
    return (this->_Myend() != this->_Mylast());
    }

这是错误消息:

Exception thrown: read access violation.
std::_Vector_alloc<std::_Vec_base_types<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > >::_Myend(...) returned 0xC.

这是我用来测试的文本文件: //文本文件 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好

标签: c++visual-studiovisual-c++

解决方案


正如@molbdnilo 所指出的:我忘了分配“文件”。

将构造函数改成如下后,问题就解决了:

TextQuery::TextQuery(std::ifstream &is):file(new vector<string>)
{
    string text;
    while (getline(is, text)) {
        file->push_back(text); //*
    //...
    }
}

推荐阅读