gpt4 book ai didi

c++ - 为什么在调用构造函数后会崩溃?我正在尝试将shared_ptr推回 vector

转载 作者:行者123 更新时间:2023-12-02 10:28:25 25 4
gpt4 key购买 nike

我对编程非常陌生(目前正在学习C++)。我正在尝试学习如何使用智能指针。
我正在尝试从教程中解决一个挑战,该教程的目标是将数据点填充到包含指向数据点的unique_ptr的 vector 的shared_ptr中。当我运行它时,它显示0错误和0警告,所以我对出错的地方有些迷茫,因为当我开始添加data(int)时它崩溃了。非常感谢您对此代码进行的一些帮助。我仍然对使用智能指针感到困惑。

#include <iostream>
#include <memory>
#include <vector>


class Test {
private:
int data;
public:
Test():data(0) {std::cout<<"\tTest constructor ("<< data << ")"<<std::endl;}
Test(int data): data{data} {std::cout<< "\tTest constructor ("<< data << ")"<<std::endl;}
int get_data() const {return data;}
~Test(){std::cout<<"\tTest destructor ("<<data<<")"<<std::endl;}
};


//Function prototypes
std::unique_ptr<std::vector<std::shared_ptr<Test>>>make();
void fill(std::vector<std::shared_ptr<Test>> &vec, int num);
void display(const std::vector<std::shared_ptr<Test>>&vec);

std::unique_ptr<std::vector<std::shared_ptr<Test>>>make(){
return std::unique_ptr<std::vector<std::shared_ptr<Test>>>();
}

void fill(std::vector<std::shared_ptr<Test>> &vec, int num){
int temp;
for(int i=0; i<num; ++i){
std::cout<<"Enter the data points for ["<<i<<"]:";
std::cin>>temp;
std::shared_ptr<Test>p1 {new Test {temp}};
vec.push_back(p1);
}
}

void display(const std::vector<std::shared_ptr<Test>>&vec){
std::cout<<"--DISPLAYING VECTOR DATA--"<<std::endl;

for(const auto &i:vec)
std::cout<<i->get_data()<<std::endl;

}


int main() {
std::unique_ptr<std::vector<std::shared_ptr<Test>>> vec_ptr;
vec_ptr = make();
int num;

std::cout<<"How many data points do you want to enter: ";
std::cin >> num;
fill(*vec_ptr, num);
display(*vec_ptr);
return 0;
}

最佳答案

make函数中,return std::unique_ptr<std::vector<std::shared_ptr<Test>>>();仅返回不包含任何内容的空std::unique_ptr。像*vec_ptr一样对其取消引用和使用会导致 undefined 的行为。
你可以

return std::unique_ptr<std::vector<std::shared_ptr<Test>>>(new std::vector<std::shared_ptr<Test>>);
或更好
return std::make_unique<std::vector<std::shared_ptr<Test>>>();

关于c++ - 为什么在调用构造函数后会崩溃?我正在尝试将shared_ptr推回 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63312625/

25 4 0