使用智能指针读取访问冲突
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;
}
我正在尝试使用 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;
}