4 Stimmen

Umwandlung eines Zeigers in einen int / Speichern von Zeigern auf den Typ T

Ich hoffe, dass ich zählen kann, wie oft ein Zeiger verwendet wird. Ich habe eine Karte:

static std::map<unsigned int, unsigned int> counters;

Wenn ich einen neuen Wert einfügen möchte, verwende ich ihn wie folgt:

template<class T>
MyClass::addPointer(T * tPtr){
    counters[((unsigned int) tPtr)]++;
}

Ist es OK und sicher, so einen Gips zu machen? Ist das nicht eine teure Operation usw.?

Ist dies auch ein geeigneter Weg, um sicherzustellen, dass jeder Zeiger nur eine Zählung erhält?

Danke

3voto

iammilind Punkte 64857

IMO, Sie brauchen es wirklich nicht zu werfen, um unsigned int . Sie können die map avec void* :

static std::map<void*, unsigned int> counters;

Auch eine Nullkontrolle ist hier wichtig:

template<class T>
MyClass::addPointer(T * tPtr){
  if(tPtr != 0)
    counters[tPtr]++;
}

Der Rest ist in Ordnung.

1voto

Armen Tsirunyan Punkte 125469

Ich schlage vor, dass Sie eine andere Karte behalten sollten, um die Besetzung zu vermeiden

map<const volatile void*, unsigned int>

0voto

Cubbi Punkte 44766

Wenn Ihr Compiler den C99/C++0x-Typ unterstützt uintptr_t (definiert in stdint.h / cstdint ), dem vorzeichenlosen Integer-Typ, der speziell für die Speicherung von Zeigerwerten als Ganzzahlen gedacht ist.

Andernfalls können, wie bereits erwähnt, Zeiger selbst als Schlüssel verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X