您好我有一个类它包含结构的一些阵列在报头被定义为以下的是:内存泄漏
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;
在构造存储器分配为以下和执行然后将结构填充所需的初始值:
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;
}
}
}
在析构函数指针被删除如下:
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;
还是有内存泄漏,我在任务管理器中测试过。如果大数组被创建并销毁,程序将使用所有可用的RAM,程序将以未处理的错误终止。如果有人能帮我解析器的问题,我将不胜感激。
============================================== =========================== 更新析构函数的版本,将正确删除所有分配的回忆是:
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;
}
你真的不必在C++中编写这样复杂的代码。查看标准库容器,如'std :: vector'。 – juanchopanza
哦,我的上帝......什么是所有的指针和“新”和“删除”....这是可怕的!难怪你有内存管理问题...... –
除了眼屎造物之外,“我在任务管理器中测试过它” - 应该是* last *用于确定内存泄漏的东西列表在Windows上。您应该使用[CRT内存设施](https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx)。我还不清楚为什么'Features'甚至被提及* *,因为它在ctor或dtor中都没有明显的用法。 – WhozCraig