【问题标题】:How does std::map make sure all pointers are null?std::map 如何确保所有指针都为空?
【发布时间】:2013-03-29 21:37:38
【问题描述】:

我正在实现一个类似于 std 的自定义地图类,但是我有一个问题。在他们的地图中,当你这样做时(例如):

map<string, SomeObject*> container;
SomeObject* object = container["this doesn't exist"];

在调试器对象中是 0x0000000,因此映射中的无效值始终为 null。但是,在我的映射中,无效值就像未初始化的指针 - 它们具有无效值,例如 0xcdcdcdcd,但是在 Release 模式下它是另外一回事,所以我不能依赖检查

if(object == 0xcdcdcdcd)

所以我希望能够做到这一点:

MyMap<string, SomeObject*> container;
SomeObject* object = container["this doesn't exist"]; //and for this to definetely be nullptr

这样我就可以了

if(object == nullptr)
   DoSomething();

我有一个 bool ContainsKey(KeyType key); 函数,但它涉及一个 for 循环。有什么方法可以确保我在地图初始化时想要什么,或者我有制作一个自定义的 PointerWrapper,它将包含 SomeObject 的指针,该指针在 PointerWrapper 的构造函数中设置为 nullptr ?我很难弄清楚 std 标头中发生了什么,它们有大量的宏和 typedef。

【问题讨论】:

标签: c++ stl std stdmap


【解决方案1】:

如果您显式构造对象

,您的值(任何类型)将被初始化
SomeObject* object = SomeObject*();
//                              ^^ Explicit construction

对于类,显然是调用了默认构造函数。

对于像ints 和指针(像SomeObject*)这样的内置类型,它们将被零初始化(而不是未初始化)

因此,虽然您可以在特定的指针示例中使用 = NULL,但像这样的语法对于所有类型都是正确的。

template < typename Key, typename Value >
void MyMap<Key, Value> add_new_key( const Key &k )
{
   std::pair<Key, Value>( k, Value() );
//                                ^^ Either calls constructor or zero-initializes

   // Store the data as you wish...
}

【讨论】:

    【解决方案2】:

    std::map value 初始化它在内部创建的任何新值。对于标量类型,这意味着它们被初始化为 0。

    【讨论】:

      【解决方案3】:

      使用 std::map 当您引用不存在的条目时,它会创建一个并将其值设置为空。对于意味着将值设置为null的指针;

      【讨论】:

        猜你喜欢
        • 2013-11-27
        • 2013-01-05
        • 2013-01-05
        • 1970-01-01
        • 2013-06-30
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多