C++ 基于向量共享ptr的故障分割

C++ 基于向量共享ptr的故障分割,c++,vector,shared-ptr,C++,Vector,Shared Ptr,我第一次使用共享ptr,请原谅我犯了一个非常愚蠢的错误,并帮助我克服这个分割错误 我希望有一个私有的向量,它可以从不同的类中读取,即使对象被破坏。因此我读到了关于std::shared\u ptr 代码在storeCounterData功能中给出SEGFULT 提前感谢您的帮助 main.cpp #include <iostream> #include "counter.hpp" #include "getCounter.hpp" const int max_ports = 3;

我第一次使用共享ptr,请原谅我犯了一个非常愚蠢的错误,并帮助我克服这个分割错误

我希望有一个私有的
向量
,它可以从不同的类中读取,即使对象被破坏。因此我读到了关于std::shared\u ptr

代码在
storeCounterData
功能中给出SEGFULT

提前感谢您的帮助

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”
#包括“getCounter.hpp”
const int max_port=3;
int main()
{
计数器*计数器=新计数器(3);
计数器->年龄=1;
计数器->id=12;
计数器->pincode=123;
向量计数器数据;
std::coutid=计数器->id;
vecData[user]->pincode=计数器->pincode;

std::cout在
计数器的构造函数中
您正在创建一个空的
共享\u ptr
的向量,即没有
计数器的托管对象(

只需将行更改为:

Counter(int vecSize) : vecData(vecSize, std::make_shared<Counter>()) {}
  • 使用
    std::vector::push_back
    ,这样向量中只有“valid”(您永远无法确定这一点)
    shared_ptr

  • 计数器
    的构造函数中,您正在创建一个空
    共享\u ptr
    的向量,即没有
    计数器
    ()的托管对象

    只需将行更改为:

    Counter(int vecSize) : vecData(vecSize, std::make_shared<Counter>()) {}
    
  • 使用
    std::vector::push_back
    ,这样向量中只有“valid”(您永远无法确定这一点)
    shared_ptr

  • 在哪里给
    vecData
    a size?@melpomene通过构造函数Counter::Counter(int-vecSize):vecData(vecSize){哦,那太好了。在Firefox中,页面搜索被破坏了。它没有发现出现
    vecData
    。你正在访问大小为3的向量中的第四个元素。好的,即使我作为用户通过0 1 2,错误仍然存在。问题是我使用和初始化共享的方式。\r你在哪里给
    vecData
    一个大小?@melpomene th粗略计算构造函数计数器::计数器(int vecSize):vecData(vecSize){哦,那太好了。在Firefox中,页面搜索被破坏了。它没有发现出现
    vecData
    。您正在访问大小为3的向量中的第四个元素。好的,即使我以用户身份通过0 1 2,SEGFULT仍然存在。问题是我使用和初始化解决SEGFULT的共享\u ptrTanks Mike的方式,但我仍然得到了解决第二次调用get counterData时,将向量中的值设置为0。o/p如下所示。内部主向量大小内部storeCounterData=3内部向量大小内部storeCounterData=3内部向量大小内部storeCounterData=3内部主调用getCounterData内部向量大小getCounterData=3 1 12 123 1 12 12 12向量大小内部getCounterData=3 0 0 0 0 0 0 0 0 0 0 0 0 0 0内部getCounterData=3 0 0 0 0 0 0 0 0 0 0 0 0感谢Mike解决了segfault,但对于第二次调用get counterData,我仍然将向量中的值作为0。o/p如下所示。内部主向量大小在storeCounterData内=3向量大小在storeCounterData内a=3存储计数器数据内的向量大小=3主调用getCounterData内的向量大小getCounterData内的向量大小=3 1 12 123 1 12 123 getCounterData内的向量大小=3 0 0 0 0 0 0 0 getCounterData内的向量大小=3 0 0 0 0 0 0 0 0 0 0 0 0
    Counter(int vecSize) : vecData(vecSize, std::make_shared<Counter>()) {}
    
    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;
        }
      }
    }