C++ STL 容器中的 NULL 指针
不幸的是,我并没有完全开发自己开发的程序。 我最近注意到 unordered_set 的运算符 -- 上出现 Visual Studio 致命错误,该错误是通过简单插入指向 unordered_set 的指针而调用的。在查看了当地人之后,我注意到 set 只有 2 个元素,最后一个为 NULL (所以我想这就是它崩溃的原因)。现在的问题是:(理论上)unordered_set(或任何其他 STL 容器)如何获取 NULL 指针作为其元素之一。程序是多线程的,但根据我的评论,这部分代码应该只能从一个线程访问。谢谢。
有兴趣的人可以查看调用堆栈和部分源代码: http://privatepaste.com/c8e7f35a4e (PushToProcessed是从Object本身调用的,它传递对自身的引用,所以不能为 NULL)
I am, unfortunately, not working on a program developed by myself fully.
I recently I noticed a Visual Studio Fatal Error on operator-- of unordered_set, which was called from simple insertion of a pointer to unordered_set. After reviewing the locals, I've noticed that set only has 2 elements last of which is NULL (so I suppose that's what it crashed on). Now to the question: How (theoretically) can an unordered_set (or any other STL container) get a NULL pointer as one of its elements. Program is multi-threaded, but according to my reviews, that part of code should only be accessed from one thread. Thanks.
Call stack and parts of source code for those who are interested:
http://privatepaste.com/c8e7f35a4e (PushToProcessed is called from Object itself, it passes reference to itself, so cannot be NULL)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
集合可以包含可以为 NULL 的指针。
容器可以轻松包含 NULL 值。您是在谈论容器的内部结构变得混乱吗?
Sets can contain pointers which can be NULL.
A container can easily contain a NULL value. Are you talking about the internals of a container getting messed up?
NULL 是完全有效的指针值。如果传入 NULL,它将像任何内存地址一样被处理。由于您只看到 2 个条目,我敢打赌您真正看到的是许多 NULL 指针被“添加”到您的集合中,但由于它是一个集合,因此仅保留一个副本。
编辑:
为了测试我的假设,即许多项目被添加为所有 NULL 值,为什么不对 cout 进行简单的调用,说明“添加了地址 = 的新项目”指针的值。打赌你会感到惊讶。
a NULL is a perfectly valid pointer value. If a NULL is passed in, it will be treated just like any memory address. Since you're seeing only 2 entries I would wager a guess that what you really are seeing is many NULL pointers being "added" to your set but since it is a set only one copy retained.
Edit:
To test my hypothesis of many items being added all of NULL value why not put in a simple call to cout stating "New item added with address = " the value of the pointer. Bet you'll be surprised.
我相信容器指针值可以通过取消引用的非常量迭代器来设置,如 (*iter) = NULL。这当然会糟糕。
I believe a container pointer value can be set via a dereferenced non-const iterator as in (*iter) = NULL. This of course would be bad.