【问题标题】:Segmentation fault on using shared_ptr with vectors将 shared_ptr 与向量一起使用时的分段错误
【发布时间】:2018-06-03 07:23:48
【问题描述】:

如果我犯了一个非常愚蠢的错误,请原谅我第一次使用 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;
}

计数器.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

计数器.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

主目录

分段错误(核心转储)

【问题讨论】:

  • 你在哪里给vecData一个尺寸?
  • @melpomene 通过构造函数 Counter::Counter(int vecSize):vecData(vecSize) { }
  • 哦,这太令人愉快了。 Firefox 中的页内搜索已损坏。它没有发现 vecData 的出现。
  • 您正在访问大小为 3 的向量中的第 4 个元素。
  • 好的,即使我将 0 1 2 作为用户传递,段错误仍然存​​在问题是我使用和初始化 shared_ptr 的方式

标签: c++ vector shared-ptr


【解决方案1】:

在Counter 的构造函数中,您正在创建一个空的shared_ptrs 向量,即没有Counter (see (1) here) 的托管对象。

只需将行更改为:

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

编辑: 您正在创建一个指针向量,因此我在这里看到了两个选项来说明您希望它的工作方式:

  1. 您的操作方式:使用 3 个shared_ptrs 实例化向量,但是您需要在访问指针时检查指针是否已经创建。

也许这就是要走的路。 shared_ptrs 也是指针,您应该这样对待它们并始终检查其有效性。

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;
    }
  }
}
  1. 使用std::vector::push_back,以便向量中只有“有效”(您永远无法确定)shared_ptr。

【讨论】:

  • 感谢 Mike 解决了段错误,但在第二次调用 get counterData 时,我仍然将向量中的值设为 0。 o/p 如下所示。 storeCounterData 内部的主向量大小 = 3 storeCounterData 内部的向量大小 = 3 storeCounterData 内部的向量大小 = 3 主调用 getCounterData 内部的向量大小 getCounterData = 3 1 12 123 1 12 123 1 12 123 getCounterData 内部的向量大小 = 3 0 0 0 0 0 0 0 0 0 getCounterData 内的向量大小 = 3 0 0 0 0 0 0 0 0 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2012-10-08
相关资源
最近更新 更多