fix: memleaks

there were some memleaks I left out of laziness. fixed.
This commit is contained in:
laochailan 2011-04-26 22:39:50 +02:00
parent 72286b4529
commit 3f2885e185
18 changed files with 68 additions and 35 deletions

View file

@ -65,8 +65,13 @@ Animation *get_ani(char *name) {
return res;
}
void delete_animation(void **anis, void *ani) {
free(((Animation *)ani)->name);
delete_element(anis, ani);
}
void delete_animations() {
delete_all_elements((void **)&global.animations);
delete_all_elements((void **)&global.animations, delete_animation);
}
void draw_animation(float x, float y, int row, char *name) {

View file

@ -67,6 +67,11 @@ void play_sound_p(Sound *snd) {
}
}
void delete_sound(void **snds, void *snd) {
free(((Sound *)snd)->name);
alDeleteBuffers(1, &((Sound *)snd)->alsnd);
}
void delete_sounds() {
delete_all_elements((void **)&global.sounds);
delete_all_elements((void **)&global.sounds, delete_sound);
}

View file

@ -41,13 +41,17 @@ void create_enemy(Enemy **enemies, EnemyDrawRule draw_rule, EnemyLogicRule logic
e->logic_rule(e, EVENT_BIRTH);
}
void delete_enemy(Enemy **enemies, Enemy* enemy) {
enemy->logic_rule(enemy, EVENT_DEATH);
void _delete_enemy(void **enemies, void* enemy) {
((Enemy* )enemy)->logic_rule(enemy, EVENT_DEATH);
delete_element((void **)enemies, enemy);
}
void free_enemies(Enemy **enemies) {
delete_all_elements((void **)enemies);
void delete_enemy(Enemy **enemies, Enemy* enemy) {
_delete_enemy((void**) enemies, enemy);
}
void delete_enemies(Enemy **enemies) {
delete_all_elements((void **)enemies, _delete_enemy);
}
void draw_enemies(Enemy *enemies) {

View file

@ -46,7 +46,7 @@ void create_enemy(Enemy **enemies, EnemyDrawRule draw_rule, EnemyLogicRule logic
complex pos, int hp, void *parent, complex args, ...);
void delete_enemy(Enemy **enemies, Enemy* enemy);
void draw_enemies(Enemy *enemies);
void free_enemies(Enemy **enemies);
void delete_enemies(Enemy **enemies);
void process_enemies(Enemy **enemies);

View file

@ -9,7 +9,7 @@
#include "global.h"
#include "list.h"
Laser *create_laser(LaserType type, complex pos, complex pos0, int time, int deathtime, Color color, LaserRule rule, complex args, ...) {
Laser *create_laser(LaserType type, complex pos, complex pos0, int time, int deathtime, Color *color, LaserRule rule, complex args, ...) {
Laser *l = create_element((void **)&global.lasers, sizeof(Laser));
l->type = type;
@ -85,7 +85,7 @@ void draw_laser_curve(Laser *laser) {
Texture *tex = get_tex("lasercurve");
glBindTexture(GL_TEXTURE_2D, tex->gltex);
glColor4fv((float *)&laser->color);
glColor4fv((float *)laser->color);
for(i = 0; i < 2; i++) {
float t = global.frames - laser->birthtime - laser->time;
if(t < 0)
@ -138,8 +138,8 @@ void draw_lasers() {
}
}
void free_lasers() {
delete_all_elements((void **)&global.lasers);
void delete_lasers() {
delete_all_elements((void **)&global.lasers, delete_element);
}
void process_lasers() {

View file

@ -29,7 +29,7 @@ typedef struct Laser {
complex pos;
complex pos0; // if type == LaserLine, carg(pos0) is orientation and cabs(pos0) width
Color color;
Color *color;
int birthtime;
int time; // line: startup time; curve: length
@ -39,7 +39,7 @@ typedef struct Laser {
complex args[4];
} Laser;
Laser *create_laser(LaserType type, complex pos, complex pos0, int time, int deathtime, Color color, LaserRule rule, complex args, ...);
Laser *create_laser(LaserType type, complex pos, complex pos0, int time, int deathtime, Color *color, LaserRule rule, complex args, ...);
void draw_lasers();
void free_lasers();
void process_lasers();

View file

@ -33,7 +33,7 @@ void *create_element(void **dest, int size) {
return e;
}
void *delete_element(void **dest, void *e) {
void delete_element(void **dest, void *e) {
if(((List *)e)->prev != NULL)
((List *)((List *)e)->prev)->next = ((List *)e)->next;
if(((List *)e)->next != NULL)
@ -44,14 +44,14 @@ void *delete_element(void **dest, void *e) {
free(e);
}
void *delete_all_elements(void **dest) {
void *delete_all_elements(void **dest, void (callback)(void **, void *)) {
void *e = *dest;
void *tmp;
while(e != 0) {
tmp = e;
e = ((List *)e)->next;
delete_element(dest, tmp);
callback(dest, tmp);
}
*dest = NULL;

View file

@ -13,7 +13,7 @@
*/
void *create_element(void **dest, int size);
void *delete_element(void **dest, void *e);
void *delete_all_elements(void **dest);
void delete_element(void **dest, void *e);
void *delete_all_elements(void **dest, void (callback)(void **, void *));
#endif

View file

@ -115,7 +115,7 @@ void plr_bomb(Player *plr) {
if(e->hp != ENEMY_IMMUNE)
e->hp = 0;
free_projectiles();
delete_projectiles();
play_sound("laser1");
@ -139,5 +139,5 @@ void plr_death(Player *plr) {
}
if(plr->slaves)
free_enemies(&plr->slaves);
delete_enemies(&plr->slaves);
}

View file

@ -49,8 +49,8 @@ void draw_poweritems() {
}
}
void free_poweritems() {
delete_all_elements((void **)&global.poweritems);
void delete_poweritems() {
delete_all_elements((void **)&global.poweritems, delete_element);
}
void move_poweritem(Poweritem *p) {

View file

@ -38,7 +38,7 @@ typedef struct Poweritem{
void create_poweritem(complex pos, complex v, Type type);
void delete_poweritem(Poweritem *poweritem);
void draw_poweritems();
void free_poweritems();
void delete_poweritems();
int collision(Poweritem *p);
void process_poweritems();

View file

@ -56,12 +56,17 @@ Projectile *create_projectile(char *name, complex pos, Color *clr,
return p;
}
void delete_projectile(Projectile *proj) {
delete_element((void **)&global.projs, proj);
void _delete_projectile(void **projs, void *proj) {
free(((Projectile*)proj)->clr);
delete_element(projs, proj);
}
void free_projectiles() {
delete_all_elements((void **)&global.projs);
void delete_projectile(Projectile *proj) {
_delete_projectile((void **)&global.projs, proj);
}
void delete_projectiles() {
delete_all_elements((void **)&global.projs, _delete_projectile);
}
int collision_projectile(Projectile *p) {

View file

@ -52,10 +52,9 @@ inline Color *rgb(float r, float g, float b);
Projectile *create_projectile(char *name, complex pos, Color *clr, ProjRule rule, complex args, ...);
void delete_projectile(Projectile *proj);
void delete_projectiles();
void draw_projectile(Projectile *proj);
void draw_projectiles();
void free_projectiles();
int collision_projectile(Projectile *p);
void process_projectiles();

View file

@ -101,6 +101,11 @@ GLuint get_shader(const char *name) {
return res->prog;
}
void delete_shader(void **shas, void *sha) {
free(((Shader *)sha)->name);
glDeleteShader(((Shader*)sha)->prog);
}
void delete_shaders() {
delete_all_elements((void **)&global.shaders);
delete_all_elements((void **)&global.shaders, delete_shader);
}

View file

@ -185,9 +185,9 @@ void stage_logic() {
}
void stage_end() {
free_projectiles();
free_enemies(&global.enemies);
free_poweritems();
delete_projectiles();
delete_enemies(&global.enemies);
delete_poweritems();
global.frames = 0;
}

View file

@ -128,7 +128,7 @@ void cirno_test(Boss *c, int time) {
int i;
if(!(time % 50))
for(i = 0; i < 6; i++)
create_laser(LaserCurve, c->pos, c->pos, 50, 200, ((Color){0.5,0.5,1,0.4}), lolsin, i);
create_laser(LaserCurve, c->pos, c->pos, 50, 200, rgba(0.5,0.5,1,0.4), lolsin, i);
}
Boss *create_cirno() {

View file

@ -77,9 +77,17 @@ Texture *get_tex(char *name) {
return res;
}
void delete_texture(void **texs, void *tex) {
Texture *t = (Texture *)tex;
free(t->name);
glDeleteTextures(1, &t->gltex);
delete_element((void **)texs, tex);
}
void delete_textures() {
delete_all_elements((void **)&global.textures);
delete_all_elements((void **)&global.textures, delete_texture);
}
Texture *load_texture(const char *filename) {

View file

@ -29,6 +29,8 @@ typedef struct Texture {
Texture *get_tex(char *name);
void load_textures();
void load_resources();
void delete_texture(void **texs, void *tex);
void delete_textures();
Texture *load_texture(const char *filename);