C++ 删除C+中的嵌套指针时出现内存泄漏+;在VisualStudio中
嗨,我有一个类,它包含一些结构数组,这些结构在标题中定义如下:C++ 删除C+中的嵌套指针时出现内存泄漏+;在VisualStudio中,c++,visual-studio,memory-leaks,C++,Visual Studio,Memory Leaks,嗨,我有一个类,它包含一些结构数组,这些结构在标题中定义如下: struct ball { int* time; float* x; float* y; float* vx; float* vy; }*Ball; struct team { int* time; char* side; int* unum; int* type; int* state; float* x; float* y;
struct ball
{
int* time;
float* x;
float* y;
float* vx;
float* vy;
}*Ball;
struct team
{
int* time;
char* side;
int* unum;
int* type;
int* state;
float* x;
float* y;
float* vx;
float* vy;
float* body_angle;
float* head_angle;
}**TeamLeft, **TeamRight;
struct teamscore
{
string name_l;
string name_r;
int* time;
int* score_l;
int* score_r;
int* pen_score_l;
int* pen_score_r;
int* pen_miss_l;
int* pen_miss_r;
}*TeamScore;
int** playmode;
for (int i = 0; i < file_num; i++)
{
for (int j = 0; j < 11; j++)
{
delete TeamLeft[i][j].time;
delete TeamLeft[i][j].side;
delete TeamLeft[i][j].unum;
delete TeamLeft[i][j].type;
delete TeamLeft[i][j].state;
delete TeamLeft[i][j].x;
delete TeamLeft[i][j].y;
delete TeamLeft[i][j].vx;
delete TeamLeft[i][j].vy;
delete TeamLeft[i][j].body_angle;
delete TeamLeft[i][j].head_angle;
delete TeamRight[i][j].time;
delete TeamRight[i][j].side;
delete TeamRight[i][j].unum;
delete TeamRight[i][j].type;
delete TeamRight[i][j].state;
delete TeamRight[i][j].x;
delete TeamRight[i][j].y;
delete TeamRight[i][j].vx;
delete TeamRight[i][j].vy;
delete TeamRight[i][j].body_angle;
delete TeamRight[i][j].head_angle;
}
}
for (int i = 0; i < file_num; i++)
{
delete Ball[i].time;
delete Ball[i].x;
delete Ball[i].y;
delete Ball[i].vx;
delete Ball[i].vy;
delete TeamLeft[i];
delete TeamRight[i];
delete TeamScore[i].time;
delete TeamScore[i].score_l;
delete TeamScore[i].score_r;
delete TeamScore[i].pen_score_l;
delete TeamScore[i].pen_score_r;
delete TeamScore[i].pen_miss_l;
delete TeamScore[i].pen_miss_r;
delete playmode[i];
}
delete Ball;
delete [] TeamScore;
delete TeamLeft;
delete TeamRight;
delete playmode;
构造函数内内存分配按以下步骤执行,然后填充结构以获得所需的初始值:
Ball = new ball[file_num];
TeamScore = new teamscore[file_num];
TeamLeft = new team*[file_num];
TeamRight = new team*[file_num];
playmode = new int*[file_num];
for (int i = 0; i < file_num; i++)
{
Ball[i].time = new int[frames_num];
Ball[i].x = new float[frames_num];
Ball[i].y = new float[frames_num];
Ball[i].vx = new float[frames_num];
Ball[i].vy = new float[frames_num];
TeamLeft[i] = new team[11];
TeamRight[i] = new team[11];
TeamScore[i].time = new int[frames_num];
TeamScore[i].score_l = new int[frames_num];
TeamScore[i].score_r = new int[frames_num];
TeamScore[i].pen_score_l = new int[frames_num];
TeamScore[i].pen_score_r = new int[frames_num];
TeamScore[i].pen_miss_l = new int[frames_num];
TeamScore[i].pen_miss_r = new int[frames_num];
playmode[i] = new int[frames_num];
for (int j = 0; j < 11; j++)
{
TeamLeft[i][j].time = new int[frames_num];
TeamLeft[i][j].side = new char[frames_num];
TeamLeft[i][j].unum = new int[frames_num];
TeamLeft[i][j].type = new int[frames_num];
TeamLeft[i][j].state = new int[frames_num];
TeamLeft[i][j].x = new float[frames_num];
TeamLeft[i][j].y = new float[frames_num];
TeamLeft[i][j].vx = new float[frames_num];
TeamLeft[i][j].vy = new float[frames_num];
TeamLeft[i][j].body_angle = new float[frames_num];
TeamLeft[i][j].head_angle = new float[frames_num];
TeamRight[i][j].time = new int[frames_num];
TeamRight[i][j].side = new char[frames_num];
TeamRight[i][j].unum = new int[frames_num];
TeamRight[i][j].type = new int[frames_num];
TeamRight[i][j].state = new int[frames_num];
TeamRight[i][j].x = new float[frames_num];
TeamRight[i][j].y = new float[frames_num];
TeamRight[i][j].vx = new float[frames_num];
TeamRight[i][j].vy = new float[frames_num];
TeamRight[i][j].body_angle = new float[frames_num];
TeamRight[i][j].head_angle = new float[frames_num];
}
}
for (int Fi = 0; Fi < file_num; Fi++)
{
TeamScore[Fi].name_l = "None";
TeamScore[Fi].name_r = "None";
for (int Fr = 0; Fr < frames_num; Fr++)
{
Ball[Fi].time[Fr] = 0;
Ball[Fi].x[Fr] = 0;
Ball[Fi].y[Fr] = 0;
Ball[Fi].vx[Fr] = 0;
Ball[Fi].vy[Fr] = 0;
TeamScore[Fi].time[Fr] = 0;
TeamScore[Fi].score_l[Fr] = 0;
TeamScore[Fi].score_r[Fr] = 0;
TeamScore[Fi].pen_score_l[Fr] = 0;
TeamScore[Fi].pen_score_r[Fr] = 0;
TeamScore[Fi].pen_miss_l[Fr] = 0;
TeamScore[Fi].pen_miss_r[Fr] = 0;
playmode[Fi][Fr] = 0;
for (int Ti = 0; Ti < 11; Ti++)
{
TeamLeft[Fi][Ti].time[Fr] = 0;
TeamLeft[Fi][Ti].side[Fr] = 'L';
TeamLeft[Fi][Ti].unum[Fr] = 0;
TeamLeft[Fi][Ti].type[Fr] = 0;
TeamLeft[Fi][Ti].state[Fr] = 0;
TeamLeft[Fi][Ti].x[Fr] = 0;
TeamLeft[Fi][Ti].y[Fr] = 0;
TeamLeft[Fi][Ti].vx[Fr] = 0;
TeamLeft[Fi][Ti].vy[Fr] = 0;
TeamLeft[Fi][Ti].body_angle[Fr] = 0;
TeamLeft[Fi][Ti].head_angle[Fr] = 0;
TeamRight[Fi][Ti].time[Fr] = 0;
TeamRight[Fi][Ti].side[Fr] = 'R';
TeamRight[Fi][Ti].unum[Fr] = 0;
TeamRight[Fi][Ti].type[Fr] = 0;
TeamRight[Fi][Ti].state[Fr] = 0;
TeamRight[Fi][Ti].x[Fr] = 0;
TeamRight[Fi][Ti].y[Fr] = 0;
TeamRight[Fi][Ti].vx[Fr] = 0;
TeamRight[Fi][Ti].vy[Fr] = 0;
TeamRight[Fi][Ti].body_angle[Fr] = 0;
TeamRight[Fi][Ti].head_angle[Fr] = 0;
}
}
}
Ball=新球[file_num];
TeamScore=新的TeamScore[文件数量];
TeamLeft=新团队*[file_num];
TeamRight=新团队*[file_num];
playmode=newint*[file_num];
对于(int i=0;i
按如下方式删除析构函数中的指针:
struct ball
{
int* time;
float* x;
float* y;
float* vx;
float* vy;
}*Ball;
struct team
{
int* time;
char* side;
int* unum;
int* type;
int* state;
float* x;
float* y;
float* vx;
float* vy;
float* body_angle;
float* head_angle;
}**TeamLeft, **TeamRight;
struct teamscore
{
string name_l;
string name_r;
int* time;
int* score_l;
int* score_r;
int* pen_score_l;
int* pen_score_r;
int* pen_miss_l;
int* pen_miss_r;
}*TeamScore;
int** playmode;
for (int i = 0; i < file_num; i++)
{
for (int j = 0; j < 11; j++)
{
delete TeamLeft[i][j].time;
delete TeamLeft[i][j].side;
delete TeamLeft[i][j].unum;
delete TeamLeft[i][j].type;
delete TeamLeft[i][j].state;
delete TeamLeft[i][j].x;
delete TeamLeft[i][j].y;
delete TeamLeft[i][j].vx;
delete TeamLeft[i][j].vy;
delete TeamLeft[i][j].body_angle;
delete TeamLeft[i][j].head_angle;
delete TeamRight[i][j].time;
delete TeamRight[i][j].side;
delete TeamRight[i][j].unum;
delete TeamRight[i][j].type;
delete TeamRight[i][j].state;
delete TeamRight[i][j].x;
delete TeamRight[i][j].y;
delete TeamRight[i][j].vx;
delete TeamRight[i][j].vy;
delete TeamRight[i][j].body_angle;
delete TeamRight[i][j].head_angle;
}
}
for (int i = 0; i < file_num; i++)
{
delete Ball[i].time;
delete Ball[i].x;
delete Ball[i].y;
delete Ball[i].vx;
delete Ball[i].vy;
delete TeamLeft[i];
delete TeamRight[i];
delete TeamScore[i].time;
delete TeamScore[i].score_l;
delete TeamScore[i].score_r;
delete TeamScore[i].pen_score_l;
delete TeamScore[i].pen_score_r;
delete TeamScore[i].pen_miss_l;
delete TeamScore[i].pen_miss_r;
delete playmode[i];
}
delete Ball;
delete [] TeamScore;
delete TeamLeft;
delete TeamRight;
delete playmode;
for(int i=0;i
仍然存在内存泄漏,我在任务管理器中对其进行了测试。如果创建并销毁大型阵列,程序将使用所有可用RAM,程序将因未经处理的错误而终止。我将使用应用程序
delete TeamLeft[i][j].time;
delete [] TeamLeft[i][j].time;