1

I'm quite new to programming (currently learning C++). I'm trying to learn how to use smart pointers.

I'm trying to do a challenge from a tutorial in which the goal is to fill in data points to a unique_ptr of a vector that contains shared_ptrs that points to a data point. When I run it, it shows 0 errors and 0 warnings so I'm a bit lost on what went wrong since it crashes when I start to add the data(int). Would really appreciate some help on what's going on with this code. I'm still confused on using smart pointers.

#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;
}
Waqar
  • 8,558
  • 4
  • 35
  • 43
GCW
  • 13
  • 2

1 Answers1

0

In the function make, return std::unique_ptr<std::vector<std::shared_ptr<Test>>>(); just returns an empty std::unique_ptr which owns nothing. Dereference and usage on it like *vec_ptr leads to undefined behavior.

You could

return std::unique_ptr<std::vector<std::shared_ptr<Test>>>(new std::vector<std::shared_ptr<Test>>);

Or better

return std::make_unique<std::vector<std::shared_ptr<Test>>>();
songyuanyao
  • 169,198
  • 16
  • 310
  • 405