Visual Studio C ++: исключение нарушения прав доступа для чтения в заголовке Vector - PullRequest
0 голосов
/ 23 июня 2018

Я копирую пример TextQuery в C ++ Primer 5-е издание.Код компилируется, но он продолжает выдавать «нарушение прав чтения» из заголовка Vector, когда выполняется операция push_back.Вот мой код (* строка с ошибкой):

//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.

Вот текстовый файл, который я использовал для тестирования: // текстовый файл - это хороший текст хороший текст хороший текст хороший текст хороший текст хороший текст хороший текст хороший

1 Ответ

0 голосов
/ 23 июня 2018

Как отметил @molbdnilo: я забыл выделить «файл».

После изменения конструктора на следующее, проблема решается:

TextQuery::TextQuery(std::ifstream &is):file(new vector<string>)
{
    string text;
    while (getline(is, text)) {
        file->push_back(text); //*
    //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...