Ошибка сегментации при использовании shared_ptr с векторами - PullRequest
0 голосов
/ 03 июня 2018

Я впервые использую shared_ptr, извините меня, если я сделал очень глупую ошибку и помог мне преодолеть эту ошибку сегментации.

Я хочу иметь приватный vector, который можно прочитатьиз разных классов, даже если объект уничтожен.Поэтому я читаю о std::shared_ptr

Код дает ошибку в функции storeCounterData

Заранее спасибо за вашу помощь !!!

main.cpp

#include <iostream>
#include "counter.hpp"
#include "getCounter.hpp"

const int max_ports = 3;

int main()
{
  Counter *counter = new Counter(3);
  counter->age = 1;
  counter->id = 12;
  counter->pincode = 123;

  std::vector<Counter*> counterData;

  std::cout<<"inside main"<<std::endl;

  counter->storeCounterData(counter,0);
  counter->storeCounterData(counter,1);
  counter->storeCounterData(counter,2);

  std::cout<<"inside main calling getCounterData"<<std::endl;
  counter->getCounterData(counterData);

  Counter countji(3);

  countji.getCounterData(counterData);

  //getCounterData class function

   getCounter *gcount = new getCounter();

   gcount->printCounterData();

  return 0;
}

Counter.hpp

#ifndef COUNTERHPP
#define COUNTERHPP
#include <vector>
#include <memory>

class Counter
{
private:
typedef std::shared_ptr<Counter> sharedCtr; 
std::vector<sharedCtr> vecData;
public:
Counter();
Counter(int vecSize);
int age, id, pincode;
void storeCounterData(Counter *counter,int user);
void getCounterData(std::vector<Counter*> &counter);

};

#endif

Counter.cpp

#include "counter.hpp"
#include <iostream>
#include <vector>

Counter::Counter()
{

}

Counter::Counter(int vecSize):vecData(vecSize)
{

}

void Counter::storeCounterData(Counter *counter,int user)
{ 
  vecData[user]->age = counter->age;
  vecData[user]->id = counter->id;
  vecData[user]->pincode = counter->pincode;

  std::cout<<"vector size inside storeCounterData = "<<vecData.size()<<std::endl;
}

void Counter::getCounterData(std::vector<Counter*> &counter)
{

  std::cout<<"vector size inside getCounterData = "<<vecData.size()<<std::endl;

for (auto& c : vecData)
  {
    std::cout << c->age << std::endl;
    std::cout << c->id << std::endl;
    std::cout << c->pincode << std::endl;
  }
}

Выход

Базука ~ / VECTOR $ ./a.out

внутри главной

Ошибка сегментации (ядро сброшено)

1 Ответ

0 голосов
/ 03 июня 2018

В конструкторе Counter вы создаете вектор пустых shared_ptr с, то есть нет управляемого объекта Counter ( см. (1) здесь ).

Просто измените строку на:

Counter(int vecSize) : vecData(vecSize, std::make_shared<Counter>()) {}

РЕДАКТИРОВАТЬ: вы создаете вектор указателей, поэтому я вижу здесь два варианта, как вы хотите, чтобы он работал:

  1. То, как вы это сделали: создайте экземпляр вектора с 3 shared_ptr с, но затем вам нужно проверять, был ли указатель уже создан, при каждом обращении к нему.

Может быть, это путь,shared_ptr s также являются указателями, вы должны обращаться с ними таким образом и всегда проверять правильность.

Counter(int vecSize) : vecData(vecSize) {} // previous constructor

void storeCounterData(Counter* counter, int user) {
  if (!vecData[user]) {
    vecData[user] = std::make_shared<Counter>();
  }
  vecData[user]->age = counter->age;
  vecData[user]->id = counter->id;
  vecData[user]->pincode = counter->pincode;

  std::cout << "vector size inside storeCounterData = " << vecData.size()
            << std::endl;
}
void getCounterData(std::vector<Counter*>& counter) {
  std::cout << "vector size inside getCounterData = " << vecData.size()
            << std::endl;

  for (auto& c : vecData) {
    if (c) {
      std::cout << c->age << std::endl;
      std::cout << c->id << std::endl;
      std::cout << c->pincode << std::endl;
    }
  }
}
Используйте std::vector::push_back, так что у вас есть только «действительный» (вы никогда не можете быть в этом уверены) shared_ptr в векторе.
...