Re: Global Operators New/Delete and Visibility Across Translation Units
ToddOuska@gmail.com ha scritto:
Alberto Ganesh Barbati wrote:
For operator new it's easy, but how do you cope with operator delete?
That's the interesting part.
He probably just uses LibDelete instead of delete:
I didn't say it was difficult, but just that he missed that part ;-)
Giving an incomplete answer can be just as bad as giving a wrong answer.
template<typename T>
void LibDelete(T* ptr)
{
if (ptr) ptr->~T();
::operator delete(ptr, UseLibDelete);
}
With the following of course:
enum DeleteParam {
UseLibDelete
};
void operator delete(void* ptr, DeleteParam param)
{
// deallocate
}
I don't understand why you want to mess with placement delete. I prefer
using a regular function, placement delete functions are bad beasts. Ah!
As we are talking of placement delete, he forgot to override the
placement delete that matches operator new (which is required in case
the constructor throws an exception).
For example:
enum LibAllocEnum { LibAlloc };
void* lib_malloc(size s);
void lib_free(void* p)
void* operator new(size_t size, LibAllocEnum)
{
return lib_malloc(s);
}
void operator delete(void* p, LibAllocEnum)
{
lib_free(p);
}
template<typename T>
void LibDelete(T* p)
{
if(p)
{
p->~T();
lib_free(p);
}
}
int main()
{
MyType* p = new(LibAlloc) MyType;
LibDelete(p);
}
HTH,
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]