c++ - 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.
这是我用来测试的文本文件: //文本文件 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好 文本很好
解决方案
正如@molbdnilo 所指出的:我忘了分配“文件”。
将构造函数改成如下后,问题就解决了:
TextQuery::TextQuery(std::ifstream &is):file(new vector<string>)
{
string text;
while (getline(is, text)) {
file->push_back(text); //*
//...
}
}
推荐阅读
- python - 仅将填充列表传递给 for 循环
- python - Django API 在请求时引发错误“没有这样的文件或目录:'manage.py'”
- python - 有没有办法在 python 中打开 .wmf 文件?
- c++ - 顺序容器和迭代器算术
- php - 我可以将我的 cPanel 设置为在我的 WP 管理区域尝试一定数量的登录尝试后禁止特定的 IP 地址吗?
- css - 检查 facebook 图像时奇怪的 CSS 背景图像 url
- http-post - Retrotif2 + RxJava 发送 POST 请求失败
- r - 通过 R 中的操作列选择具有零值的组
- tsql - 聚合在 T-SQL 中给出错误的结果
- bash - shell脚本中目录中的文件列表