【发布时间】:2015-01-14 05:26:43
【问题描述】:
我制作了一个 C 程序,其中我使用的结构定义为:
typedef struct Move{
int from_x;
int from_y;
int to_x;
int to_y;
int piece;
}Move;
typedef struct ListofMove{
Move* array;
int len;
}ListofMove;
typedef struct Board{
int B[8][8];
double value;
double value_w;
double value_b;
int material_w;
int material_b;
int mobility_w;
int mobility_b;
int dev_w;
int dev_b;
int center_w;
int center_b;
int devArr[4][8];
int side;
ListofMove moves_w;
ListofMove moves_b;
struct Board* children_w;
struct Board* children_b;
int len_w;
int len_b;
struct Board *parent;
double alpha;
double beta;
}Board;
ListofMove 和 Board* children_w 和 children_b 中的数据是使用 realloc() 函数添加的。main() 仅包含用于某些迭代的单个函数调用(这里假设为 30)
int main(){
double BW[4] = {5.689821, 39.038832, 26.088224, 60.491498};
double WW[4] = {82.091284, 83.026237, 46.478279, 49.979957};
int outres, in;
for(in = 0 ; in<20; in++){
depth = 0; Nply = 0; count = 0;
outres = gameplay(BW, WW);
}
return 0;
}
所有变量都在函数gameplay() 中本地声明,并被游戏中的其他函数调用进一步使用(通过值调用或地址调用)。使用后,所有变量都会使用函数del(Board* b) 和delm(Move* m) 显式删除。
int gameplay(double blwght[], double whwght[]){
int i, ind;
Board pre;
Board result;
Board current;
Move cur_B, cur_W;
.............
..............
.......
del(&pre);
del(&result);
del(¤t);
delm(&cur_B);
delm(&cur_W);
}
删除函数的定义
void del(Board* b){
b->beta = 0;
b->alpha = 0;
b->material_w = 0;
b->material_b = 0;
b->mobility_w = 0;
b->mobility_b = 0;
b->center_w = 0;
b->center_b = 0;
b->dev_w = 0;
b->dev_b = 0;
b->value_w = 0;
b->value_b = 0;
b->value = 0;
b->side = 0;
free(&b->value_w);
free(&b->value_b);
free(&b->center_w);
free(&b->center_b);
free(&b->dev_w);
free(&b->dev_b);
free(&b->mobility_w);
free(&b->mobility_b);
free(&b->material_w);
free(&b->material_b);
free(&b->side);
free(&b->len_w);
free(&b->len_b);
free(&b->alpha);
free(&b->beta);
free(b->B);
free(b->devArr);
free(b->parent);
ClearWBoardList(b);
ClearBBoardList(b);
ClearMoveList(&b->moves_w);
ClearMoveList(&b->moves_b);
free(&b->moves_w.array);
free(&b->moves_b.array);
free(&b->moves_w);
free(&b->moves_b);
}
void delm(Move* m){
m->from_x = 0;
m->from_y = 0;
m->to_x = 0;
m->to_y = 0;
m->piece = 0;
free(&m->from_x);
free(&m->from_y);
free(&m->to_x);
free(&m->to_y);
free(&m->piece);
}
问题是即使在变量被删除并且函数调用完全执行几次迭代之后程序崩溃(在我的系统有 3GB RAM 的情况下大约 14 次迭代之后)。检测到的问题是,在崩溃之前它使用了大约 2GB 内存,因为在一个函数调用中使用的内存在执行完成后没有被释放。即使在函数调用返回值之后,即使它们被显式删除以及解决此问题的任何解决方案,任何人都可以通过内存保留变量。
【问题讨论】:
-
realloc()/free()inc++?不是一个好方法。 -
你在哪里释放分配的内存?
-
您似乎懒得在发布之前格式化/预览您的帖子。所以懒得回答了。
-
C 还是 C++?选一个。它只能是一个。
标签: c struct linked-list free