0

不幸的是,我没有完全开发自己开发的程序。我最近注意到 unordered_set 的运算符 - 上的 Visual Studio 致命错误,它是通过简单插入指向 unordered_set 的指针来调用的。在查看了当地人之后,我注意到 set 只有 2 个元素,最后一个是 NULL (所以我想这就是它崩溃的原因)。现在问题来了:(理论上)unordered_set(或任何其他 STL 容器)如何将 NULL 指针作为其元素之一。程序是多线程的,但根据我的评论,这部分代码只能从一个线程访问。谢谢。

调用堆栈和部分源代码供感兴趣的人 参考: http ://privatepaste.com/c8e7f35a4e(PushToProcessed 是从 Object 本身调用的,它传递对自身的引用,因此不能为 NULL)

4

3 回答 3

6

集合可以包含可以为 NULL 的指针。

#include <iostream>
#include <vector>

int main () {
    std::vector<int *> foo;
    foo.push_back (NULL);
    std::cout << foo.size () << std::endl;
    return 0;
}

一个容器可以很容易地包含一个 NULL 值。您是在谈论容器的内部结构变得混乱吗?

于 2010-01-14T21:17:41.343 回答
4

NULL 是一个完全有效的指针值。如果传入 NULL,它将被视为任何内存地址。由于您只看到 2 个条目,我敢打赌,您真正看到的是许多 NULL 指针被“添加”到您的集合中,但由于它是一个集合,因此只保留了一个副本。

编辑:

为了检验我的假设,许多项目被添加了所有的 NULL 值,为什么不简单地调用 cout 说明“添加了地址 = 的新项目”指针的值。打赌你会感到惊讶。

于 2010-01-14T21:16:16.090 回答
1

我相信可以通过取消引用的非常量迭代器设置容器指针值,如 (*iter) = NULL。这当然不好

于 2010-01-14T21:43:30.790 回答