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

Read Access Violation using Smart Pointers

我正在尝试使用 push_back 作为 class 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;
}

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