gpt4 book ai didi

c++ - 级联结构指针测试代码中的段错误

转载 作者:行者123 更新时间:2023-11-30 04:32:26 26 4
gpt4 key购买 nike

以下虚拟测试代码在执行结束时给出了段错误(更具体地说是在 main 中返回 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 的类或结构分配内存,例如vectorfoo, in_foo。一旦你这样做了,所有的赌注都会被取消,你的程序显示的任何行为都是合理的。

new 与智能指针一起使用,或者如果可能的话最好使用组合。指针与 new 一起使用。

关于c++ - 级联结构指针测试代码中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7661783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com