使用智能指针读取访问冲突

时间:2018-08-28 03:56:22

标签: c++ vector shared-ptr smart-pointers push-back

我正在尝试将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 :(得分:1)

未调用您的构造函数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;
}