gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:57:21 24 4
gpt4 key购买 nike

我正在尝试使用 push_back 作为类 StrBlobm 中的成员函数的一部分,以将元素添加到共享指针中的 vector ,该指针也包含在 StrBlobm,但我不断收到此错误:

抛出异常:读取访问冲突。std::_Vector_alloc,std::allocator >,std::allocator,std::allocator >> >>::_Myend(...) 返回 0xC。发生

我在使用迭代器从共享指针内的 vector 打印时也遇到了类似的问题。是什么导致了这种违规行为,我该如何解决?

#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;
}

关于c++ - 使用智能指针读取访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com