级联结构指针测试代码中的分段错误

Segmentation fault In the Cascaded Struct Pointers Test Code

本文关键字:分段 错误 代码 结构 指针 测试 级联      更新时间:2023-10-16

以下伪测试代码在执行结束时给出分段错误(在返回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;
}

不能使用malloccalloc为非POD的类或结构分配内存,例如vectorfooin_foo。一旦你做到了,所有的赌注都会被取消,你的程序显示的任何行为都是合理的。

new与智能指针一起使用,如果可能的话,最好使用composition。将指针与new一起使用。