Приведение указателя на int / хранение указателей на тип T - PullRequest
4 голосов
/ 04 августа 2011

Я надеюсь подсчитать, сколько раз используется указатель. У меня есть карта:

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

Когда я хочу вставить новое значение, я использую его следующим образом:

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

Это нормально и безопасно делать подобный актерский состав? Это не дорогая операция и т. Д.

Кроме того, это подходящий способ гарантировать, что каждый указатель получает только один счет?

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

IMO, вам действительно не нужно приводить его к unsigned int. Вы можете иметь map с void*:

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

Также здесь важна нулевая проверка:

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

Отдых в порядке.

1 голос
/ 04 августа 2011

Я предлагаю вам оставить еще одну карту, чтобы избежать каста

map<const volatile void*, unsigned int>
0 голосов
/ 04 августа 2011

Если ваш компилятор поддерживает тип C99 / C ++ 0x uintptr_t (определенный в stdint.h / cstdint), это целочисленный тип без знака специально для хранения значений указателя в виде целых чисел.

В противном случае указатели могут использоваться в качестве самих ключей, как уже упоминалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...