This document covers all issues about ClanLib safely and correctly
All objects must both created AND destroyed inside their respective ::init() and ::deinit() groups. This means that letting an object fall out of scope might not work, especially in CL_Application::main().
... Do_Bar() { CL_SetupSound::init(); CL_SoundBuffer *soundbuffer = CL_Sample::create("beep.wav",NULL); CL_SoundBuffer_Session ses = soundbuffer->play(); ... delete soundbuffer; // Good CL_SetupSound::deinit(); //All user objects must be destroyed before now } //ses destroyed here, very bad
In this code ses is destroyed when it goes out of scope, which is after it should be destroyed. A better solution to this problem would be either wrap Do_Bar in some other function. eg
init_sound() { CL_SetupSound::init(); Do_Bar(); CL_SetupSound::deinit(); } Do_Bar() { CL_SoundBuffer *soundbuffer = CL_Sample::create("beep.wav",NULL); CL_SoundBuffer_Session ses = soundbuffer->play(); //Ok here ... delete soundbuffer; // Good }
The code above is perfectly safe as ses is destroy when Do_Bar goes out of scope which is before deinit(). Another way is to use pointers.