【问题标题】:Casting a pointer to an int / Storing pointers to type T将指针转换为 int / 将指针存储为 T 类型
【发布时间】:2011-08-04 13:40:38
【问题描述】:

我希望计算一个指针被使用了多少次。我有一张地图:

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

当我想向它插入一个新值时,我会这样使用它:

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

进行这样的演员阵容是否可行且安全?这不是一个昂贵的操作等?

另外,这是确保每个指针只获得一个计数的合适方法吗?

谢谢

【问题讨论】:

  • 你见过Boost的shared_ptr吗? (即将发布到 C++11)
  • 是的,我正在实现类似的学习目的
  • 只需添加,在 64 位系统上,指针通常比 unsigned int 大。所以使用void* 会好很多。

标签: c++ templates pointers casting


【解决方案1】:

IMO,您真的不需要将其转换为 unsigned int。您可以使用mapvoid*

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

这里的空检查也很重要:

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

休息好了。

【讨论】:

    【解决方案2】:

    我建议你应该保留另一张地图以避免演员表

    map<const volatile void*, unsigned int>
    

    【讨论】:

      【解决方案3】:

      如果您的编译器支持 C99/C++0x 类型 uintptr_t(在 stdint.h / cstdint 中定义),那是专门用于将指针值存储为整数的无符号整数类型。

      否则,指针本身可以用作键,如前所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-12
        • 2021-09-20
        • 1970-01-01
        • 2012-03-02
        • 2014-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多