我正在尝试将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;
}
答案 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;
}