009
14.01.2004, 12:44 Uhr
virtual
Sexiest Bit alive (Operator)
|
Ich sage nur, daß es keine einfache portable Möglichkeit gibt für folgendes:
C++: |
class X { public: bool is_created_with_new() { .... ??? .... } };
int main() { X a; X* b= new X;
a.is_created_with_new(); // soll false ergeben b->is_created_with_new(); // soll true ergeben }
|
Eine (triviale) Lösung dieses Problems kenn ich nicht.
Was gehen dürfte, ist das überladen vom Operator new, der dann eine liste über die belegten Speicherbereiche hält, aber das will der Fragesteller wohl nicht wissen:
C++: |
#include <iostream> #include <cstdlib> #include <map>
typedef std::map<char*,size_t> new_map_t;
new_map_t allocation_map;
void* operator new(size_t size) { char* ptr = static_cast<char*>(malloc(size)); if (NULL == ptr) throw std::bad_alloc(); allocation_map.insert(std::make_pair(ptr, size)); return ptr; }
void operator delete(void* ptr) { if (NULL != ptr) { allocation_map.erase(static_cast<char*>(ptr)); free(ptr); } }
class X { public: bool is_allocated_with_new() const { const char* ptr = reinterpret_cast<const char*>(this); for(new_map_t::const_iterator i=allocation_map.begin(); i!= allocation_map.end(); ++i) { if (ptr>=i->first && ptr<i->first+i->second) return true; } return false; } };
int main() { X a; X* b = new X;
std::cout<<"a mit new erzeugt: "<<a.is_allocated_with_new()<<std::endl; std::cout<<"b mit new erzeugt: "<<b->is_allocated_with_new()<<std::endl; }
|
Bearbeitung: |
Noch ein kleiner Nachtrag, um Zweifel auszuräumen: Ich empfehle nicht diese "Lösung" zu verwenden! Ich empfehle eher ein Programm Design, wo es keine rolle spielt, ob was mit new erzeugt wurde oder nicht!
|
-- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 14.01.2004 um 12:47 Uhr von virtual editiert. |