【问题标题】:C++ a NULL pointer in the STL containerC++ STL 容器中的 NULL 指针
【发布时间】:2010-01-14 21:11:49
【问题描述】:

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

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

【问题讨论】:

  • 一些代码会很棒
  • 您可能需要发布代码
  • unordered_set 出错的代码很简单 _processQueue.insert(obj);
  • unordered_set 本身不是标准模板库的一部分。它是 tr1 的扩展。 (并且在 boost 中也很好地实现了。)
  • 哦好吧,对于其他容器(stl)仍然是实际的

标签: c++ access-violation tr1 fatal-error unordered-set


【解决方案1】:

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

#include <iostream>
#include <vector>

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

一个容器可以很容易地包含一个 NULL 值。你是说容器的内部结构搞砸了吗?

【讨论】:

    【解决方案2】:

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

    编辑:

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

    【讨论】:

    • 无法在其中添加 NULL 指针,只是没有办法 :o
    • 如果没有你的代码,我只能假设你有一个允许 NULL 的原始指针容器。
    • 无法添加?你的意思是我不能去container.insert(0)
    • 你能发布一个最小的测试用例来重现它吗?或者至少是插入、移除和检查容器的代码的sn-ps?
    • 我会在 insert() 之前添加一个 assert() 来检查指针绝对不是 NULL。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多