为什么调用构造函数后出现崩溃?我正在尝试将shared_ptr推回向量



我对编程很陌生(目前正在学习C++(。我正在努力学习如何使用智能指针。

我试图做一个教程中的挑战,其中的目标是将数据点填充到向量的unique_ptr,该向量包含指向数据点的shared_ptrs。当我运行它时,它显示0个错误和0个警告,所以我有点不知道出了什么问题,因为当我开始添加数据(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一样取消引用和使用它会导致未定义的行为。

你可以

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>>>();

相关内容

  • 没有找到相关文章

最新更新