fix: memleaks
there were some memleaks I left out of laziness. fixed.
This commit is contained in:
parent
72286b4529
commit
3f2885e185
18 changed files with 68 additions and 35 deletions
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
12
src/enemy.c
12
src/enemy.c
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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() {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue