Um Ressourcen, die ich mit DevIL geladen habe, auch nach dem Wurf einer Exception sicher wieder zu löschen, habe ich eine kleine Klasse geschrieben, die die von DevIL zurückgebene ID im Destruktor via ilDeleteImages(ILsizei num, const ILuint *images) wieder löscht. Da man so eine Funktionalität auch allgemein für z.B. OpenGL verwenden kann, hab ich mir mal gedacht, dass man der Klasse im Konstruktor einfach einen Funktionszeiger übergibt, die dann zum Löschen verwendet wird.
Das ganze sieht dann so aus:
Code: Alles auswählen
template<typename IDType, typename SizeType>
class ScopedID
{
public:
typedef void (*DeleteFunc)(SizeType num, IDType const *id);
ScopedID(DeleteFunc del) : mID(0)
{
mDelete = del;
}
ScopedID(IDType id, DeleteFunc del) : mID(id)
{
mDelete = del;
}
~ScopedID()
{
mDelete(1, &mID);
mID = 0;
}
operator IDType* () { return &mID; }
operator IDType () { return mID; }
private:
IDType mID;
DeleteFunc mDelete;
};
Code: Alles auswählen
ScopedID<ILsizei, ILuint> id(ilDeleteImages);
error: invalid conversion from 'void (*)(ILsizei, const ILuint*)' to 'void (*)(unsigned int, const unsigned int*)'
error: initializing argument 1 of 'Kaos::ScopedID<IDType, SizeType>::ScopedID(void (*)(SizeType, const IDType*)) [with IDType = unsigned int, SizeType = unsigned int]'
Ich hab auch schon im Header von DevIL nachgeschaut, und ILsizei ist ein typedef auf size_t (was wiederum ein unsigned int ist) und GLuint ist (überraschenderweise) ein unsigned int.
Eigentlich ist meiner Meinung nach also alles in Ordnung (allerdings ist mein Compiler irgendwie recht häufig anderer Meinung als ich, wobei es so langsam immer besser wird)
Als ich eine Testfunktion foo(ILsizei num, const ILuint *images) an den Konstruktor übergeben habe, hat auf einmal alles geklappt.
Hat vielleicht jemand eine Idee woran es liegen könnte?