【问题标题】:Struct containing vector of pointers to other structs包含指向其他结构的指针向量的结构
【发布时间】:2018-10-04 06:46:05
【问题描述】:

我有一个有点复杂的数据结构,但我在插入时遇到了问题,也许我想错了。 这个数据结构有点像(我们有一个映射,它是一对 uint16_t 和结构,以及三个嵌套结构)

struct Struct4
{
  uint8_t  struct4ByteData1;
  uint8_t  struct4ByteData2;
  uint16_t struct4ShortIntData1;
  uint16_t struct4ShortIntData2;
};
struct Struct3
{
  uint32_t    struct3IntData1; 
  uint16_t    struct3ShortIntData1;
  uint16_t    numOfElementsInVectorOfStruct4;
  std::string struct3StringData;
  std::vector<std::shared_ptr<Struct4>> struct4vector;
};
struct Struct2 
{
  uint32_t    struct2IntData1; 
  uint16_t    struct2ShortIntData1;
  uint16_t    numOfElementsInVectorOfStruct3;
  int16_t     struct2ShortIntData2;
  std::string struct2StringData;
  std::vector<std::shared_ptr<Struct3>> struct3vector;
};
struct Struct1
{
  uint32_t  struct1IntData1;
  uint16_t  numOfElementsInVectorOfStruct2;
  std::vector<std::shared_ptr<Struct2>> struct2vector;
};

using uint16AndStruct1Map = std::multimap<uint16_t, Struct1>;

这是一个代码sn-p如何插入数据:

Struct1* struct1_ptr = new Struct1;
std::shared_ptr<Struct2> vectorOfStruct2;
std::shared_ptr<Struct3> vectorOfStruct3;
std::shared_ptr<Struct4> vectorOfStruct4;

uint16AndStruct1Map mapToBeInserted;

bool validData = false;

uint16_t numOfElementsInVectorOfStruct4;
uint16_t status;
uint16_t keyDataFromStruct2;

struct1_ptr->struct1IntData1 = getSomeData();
struct1_ptr->numOfElementsInVectorOfStruct2 = getSomeElements();

if (struct1_ptr->numOfElementsInVectorOfStruct2 == 0)
{
  std::cout << "No Pim Avoidance Measurement in This Message, ignore" << std::endl;
  return;
}
for(uint16_t i = 0; i < getNumOfElementsOfStruct2(); i++)
{

  vectorOfStruct2 = std::make_shared<vectorOfStruct2>();

  keyDataFromStruct2 = getKey();
  vectorOfStruct2->struct2IntData1 = getSomeData();
  vectorOfStruct2->struct2ShortIntData1 = keyDataFromStruct2;
  vectorOfStruct2->struct2ShortIntData2 = getSomeData();
  vectorOfStruct2->numOfElementsInVectorOfStruct3 = getSomeElements();
  vectorOfStruct2->struct2StringData = getSomeStringData();

  struct1_ptr->struct2vector.push_back(vectorOfStruct2);

  for(uint16_t j = 0; j < getNumOfElementsOfStruct3(); j++)
  {

    vectorOfStruct3 = std::make_shared<vectorOfStruct3>();

    vectorOfStruct3->struct3IntData1 = getSomeData();
    vectorOfStruct3->struct3ShortIntData1 = getSomeData();
    vectorOfStruct3->numOfElementsInVectorOfStruct4 = getSomeElements();
    vectorOfStruct3->struct3StringData = getSomeStringData();

    struct1_ptr->struct2vector[i]->struct3vector.push_back(vectorOfStruct3);

    numOfElementsInVectorOfStruct4 = getNumOfElementsOfStruct4();

    if(numOfElementsInVectorOfStruct4 < 10)
    {
      for(uint16_t k = 0; k < numOfElementsInVectorOfStruct4; k++)
      {
        vectorOfStruct4 = std::make_shared<vectorOfStruct4>();
        status = getStatus();
        if(status == SPECIAL_STATUS_TO_GET_INSIDE_THIS_IF_COND)
        {
          vectorOfStruct4->struct4ByteData1 = getSomeData();
          vectorOfStruct4->struct4ByteData2 = getSomeData();
          vectorOfStruct4->struct4ShortIntData1 = getSomeData();
          vectorOfStruct4->struct4ShortIntData2 = status;

          struct1_ptr->struct2vector[i]->struct3vector->struct4vector.push_back(vectorOfStruct4);
          validData = true;
        }
      }
     }
   }

  if(validData)
  {
    mapToBeInserted.insert (std::make_pair(keyDataFromStruct2,*struct1_ptr));
  }
  else
  {
    for (auto it = mapToBeInserted.begin(); it!=mapToBeInserted.end(); it++)
    {
      it->second.numOfElementsInVectorOfStruct2--;
    }
  }
  validData = false;
}

将所有内容插入地图(以及所有结构)后,当我想从此地图获取数据时,我可能会遇到内存错误。我不是 100% 确定问题是什么。 问题出现在从地图获取数据的级别:mapToBeInserted。

你能帮忙吗?

【问题讨论】:

  • 从地图读取的代码在哪里?我们需要minimal reproducible example
  • 指令struct1_ptr-&gt;struct2vector[i]-&gt;struct3vector-&gt;struct4vector.push_back(vectorOfStruct4);是否正确?应该是struct1_ptr-&gt;struct2vector[i]-&gt;struct3vector[j]-&gt;struct4vector.push_back(vectorOfStruct4); ?
  • 啊,对,我的错——不是抄的,我修改了一点,所以我剪了一点。

标签: c++ memory vector struct


【解决方案1】:

如果 numOfElementsInVectorOfStruct4 大于 10,则您不会在 struct4vector 中插入任何内容,因此此循环将超出 struct4vector 的范围:

for(uint16_t l = 0; l < kv.second.struct2vector[j]->struct3vector[k]->numOfElementsInVectorOfStruct4; l++) 
      {
        ss << "<"
        << kv.second.struct2vector[j]->struct3vector[k]->struct4vector[l]->struct4ByteData1 << ","

【讨论】:

    【解决方案2】:

    地图插入没有问题。程序因向量索引 numOfElementsInVectorOfStruct4 而崩溃。

    你已经设置了元素的数量:

    vectorOfStruct3-&gt;numOfElementsInVectorOfStruct4 = getSomeElements();

    但是struct4vector的数据是用CONDITION插入的(有两个:

    这样 struct4vector.size() 和 numOfElementsInVectorOfStruct4 的向量大小可以不同(当 numOfElementsInVectorOfStruct4

    以下是一些建议:

    • 使用指针(带映射)以避免结构元素复制
    • 在某处使用矢量 size() 函数而不是 getSomeElements()。
    • 使用前检查地图元素是否存在

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多