A
Alex Vinokur
Hi,
Different behavior overloaded global and local operator delete.
We can see see that overloaded global operator delete(void *i_p,
std::size_t i_size) is not recognized.
Any suggestions.
Thanks
// ===========================================
// File foo.cpp
#include <memory>
#include <iostream>
#define SHOW_FUNC std::cout << "Line-" << __LINE__ << ": " <<
__PRETTY_FUNCTION__ << std::endl
// ---------------------------------
// Global new & delete
// ---------------------------------
void* operator new(std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void* operator new[] (std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void operator delete(void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
void operator delete[](void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
// ---------------------------------
struct Foo
{
void* operator new(std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void* operator new[] (std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void operator delete(void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
void operator delete[](void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
};
// ====================
int main()
{
Foo* p1 = new Foo;
delete p1;
Foo* p2 = new Foo[2];
delete [] p2;
Foo* p3 = ::new Foo;
::delete p3;
Foo* p4 = ::new Foo[2];
::delete [] p4;
return 0;
}
// ===========================================
Linux
gcc version 4.1.2 20080704 (Red Hat 4.1.2-52)
Output
Line-49: static void* Foo:perator new(size_t)
Line-67: static void Foo:perator delete(void*, size_t)
Line-57: static void* Foo:perator new [](size_t)
Line-76: static void Foo:perator delete [](void*, size_t)
Line-11: void* operator new(size_t)
// Not printed -> Line-29: void operator delete(void*, size_t)
Line-19: void* operator new [](size_t)
// Not printed -> Line-38: void operator delete [](void*, size_t)
Different behavior overloaded global and local operator delete.
We can see see that overloaded global operator delete(void *i_p,
std::size_t i_size) is not recognized.
Any suggestions.
Thanks
// ===========================================
// File foo.cpp
#include <memory>
#include <iostream>
#define SHOW_FUNC std::cout << "Line-" << __LINE__ << ": " <<
__PRETTY_FUNCTION__ << std::endl
// ---------------------------------
// Global new & delete
// ---------------------------------
void* operator new(std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void* operator new[] (std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void operator delete(void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
void operator delete[](void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
// ---------------------------------
struct Foo
{
void* operator new(std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void* operator new[] (std::size_t i_size)
{
SHOW_FUNC;
void* p = malloc(i_size);
// Do something
return p;
}
void operator delete(void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
void operator delete[](void *i_p, std::size_t i_size)
{
SHOW_FUNC;
// Do something
free(i_p);
}
};
// ====================
int main()
{
Foo* p1 = new Foo;
delete p1;
Foo* p2 = new Foo[2];
delete [] p2;
Foo* p3 = ::new Foo;
::delete p3;
Foo* p4 = ::new Foo[2];
::delete [] p4;
return 0;
}
// ===========================================
Linux
gcc version 4.1.2 20080704 (Red Hat 4.1.2-52)
// No errorsg++ foo.cpp
Output
Line-49: static void* Foo:perator new(size_t)
Line-67: static void Foo:perator delete(void*, size_t)
Line-57: static void* Foo:perator new [](size_t)
Line-76: static void Foo:perator delete [](void*, size_t)
Line-11: void* operator new(size_t)
// Not printed -> Line-29: void operator delete(void*, size_t)
Line-19: void* operator new [](size_t)
// Not printed -> Line-38: void operator delete [](void*, size_t)