Нарушение прав чтения с использованием умных указателей - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь использовать push_back как часть функции-члена в классе StrBlobm для добавления элементов к вектору в общем указателе, также содержащемся в StrBlobm, но я получаю эту ошибку:

Исключение: нарушение прав на чтение. std :: _ Vector_alloc, std :: allocator>, std :: allocator, std :: allocator>>>> :: _ Myend (...) вернул 0xC. произошло

У меня похожие проблемы с использованием итераторов для печати из вектора внутри общего указателя. В чем причина этого нарушения и как я могу это исправить?

#include <memory>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <initializer_list>

class StrBlobm {
public:
    StrBlobm() = default;
    StrBlobm(std::initializer_list<std::string> il) :
        mydata(std::make_shared<std::vector<std::string>>(il)) {};

    void add(std::string& a)
    {
        mydata->push_back(a);
    }

private:
    std::shared_ptr<std::vector<std::string>> mydata;
};

int main()
{
    StrBlobm myblob;
    std::ifstream is;
    is.open("somefilepathtotxtdocument.txt");
    while(is)
    {
        std::string mystr;
        std::getline(is, mystr);
        myblob.add(mystr);
    }
    is.close();
    return 0;
}

1 Ответ

0 голосов
/ 28 августа 2018

Ваш конструктор StrBlobm(std::initializer_list<std::string> il) не называется.

Но вызывается StrBlobm(), и нет инициализирующего кода для переменной-члена mydata. (Это означает, что mydata просто указывает nullptr, и вам не следует обращаться с ключевым словом ->)

Вы должны кодировать следующим образом. (Это только один пример.)

#include <memory>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <initializer_list>

class StrBlobm {
public:
    StrBlobm() :
        mydata(std::make_shared<std::vector<std::string>>()) { // initialize mydata
    }

    StrBlobm(std::initializer_list<std::string> il) :
        mydata(std::make_shared<std::vector<std::string>>(il)) 
    {
    };

    void add(std::string& a)
    {
        mydata->push_back(a);
    }

private:
    std::shared_ptr<std::vector<std::string>> mydata;
};

int main()
{
    //call StrBlobm's default constructor (the constructor that takes no parameters.)
    StrBlobm myblob; 

    std::ifstream is;
    is.open("somefilepathtotxtdocument.txt");
    while (is)
    {
        std::string mystr;
        std::getline(is, mystr);
        myblob.add(mystr);
    }
    is.close();
    return 0;
}
...