分段故障在级联结构指针测试代码中

时间:2011-10-05 13:09:06

标签: c++ segmentation-fault free struct

以下虚拟测试代码在执行结束时给出了分段错误(在主要的返回0处更具体)。我想知道这种行为的原因。是不是因为它无法释放虚拟变量?我正在使用g ++ 4.4而没有用于测试的优化标志。

#include <vector>
#include <boost/multi_array.hpp>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using std::vector;

typedef boost::multi_array<float, 1> DVec;

class Point{
  public:
    int x, y;
    double *dist;
    DVec dir;
};

struct another_struct {
  vector <Point *>c;
};

struct in_foo{
  vector <another_struct *>aVec;
  char *aname;
  float b;
};

struct foo {
  DVec b;
  vector<in_foo *> mVec;
};

int main(){

  DVec c(boost::extents[4]);
  foo **dummy = (foo **) calloc(4, sizeof(*dummy));
  vector <in_foo *>test_var(5);

  for(int i =0; i < 6; i++){
    test_var[i] = (in_foo *) malloc(sizeof(in_foo));
    memset(test_var[i], 0, sizeof(*test_var[i]));
    test_var[i]->aname = "42!\n";
    test_var[i]->b = (float) i;
  }

  for (int i = 0 ; i < 4; i++) {
    dummy[i] = (foo *) malloc(sizeof(*dummy[i]));
    (dummy[i]->b).resize(boost::extents[2]);
    (dummy[i]->mVec) = test_var;
  }

  for (int i = 0 ; i < 4; i++) {
    for(int j = 0; j < 5; j++){
      (dummy[i]->mVec[j]->aVec).resize(5);
      for (int n = 0; n < 6; n++) {
        dummy[i]->mVec[j]->aVec[n] = new another_struct();
        (dummy[i]->mVec[j]->aVec[n])->c.resize(3);
        for (int m = 0; m < 4; m++) {
          (dummy[i]->mVec[j]->aVec[n]->c[m]) = new Point();
          (dummy[i]->mVec[j]->aVec[n]->c[m])->x = 100 * n;
          (dummy[i]->mVec[j]->aVec[n]->c[m])->y = 11000 * m;
          (dummy[i]->mVec[j]->aVec[n]->c[m])->dist = new double[2];
          (dummy[i]->mVec[j]->aVec[n]->c[m])->dist[0] =  11200.123;
          (dummy[i]->mVec[j]->aVec[n]->c[m])->dist[1] =  66503.131;
          printf("x: %d, y: %d, dist 0: %f, dist 1: %f \n", (dummy[i]->mVec[j]->aVec[n]->c[m])->x, (dummy[i]->mVec[j]->aVec[n]->c[m])->y, (dummy[i]->mVec[j]->aVec[n]->c[m])->dist[0], (dummy[i]->mVec[j]->aVec[n]->c[m])->dist[1]);
        }
      }
      printf("b: %f aname: %s \n", dummy[i]->mVec[j]->b, dummy[i]->mVec[j]->aname);
    }
  }

  if (NULL != dummy) {
    for(int i = 0; i < 4; i++)
    {
      free(dummy[i]);
    }
    free(dummy);
  }
  return 0;
}

1 个答案:

答案 0 :(得分:2)

您无法使用malloccalloc为非POD的类或结构分配内存,例如vectorfoo,{{1 }}。一旦你这样做,所有的赌注都会关闭,你的程序显示的任何行为都是合理的。

in_foo与智能指针结合使用,或者如果可能的话,更好地使用合成。使用new指针。