【发布时间】:2012-02-06 17:12:15
【问题描述】:
我的代码审阅者指出,map 的 operator[] 的使用非常糟糕,会导致错误:
map[i] = new someClass; // potential dangling pointer when executed twice
或者
if (map[i]==NULL) ... // implicitly create the entry i in the map
虽然我在阅读了insert()更好的API后理解了风险,因为它检查重复,因此可以避免发生悬空指针,我不明白如果处理得当,为什么[]可以根本不用?
我选择地图作为我的内部容器正是因为我想使用它快速且不言自明的索引功能。
我希望有人可以和我多争论或者站在我这边:)
【问题讨论】:
-
一般来说,“永远不要这样做”的规则是不好的。在某些情况下,您确实需要某些东西并且您应该打破规则。
-
(在相关说明中,请参阅Boost Pointer Containers 以了解将保留指针并在需要时销毁它们的容器)
-
你应该避免使用 [] 而更喜欢插入/查找。这是常识,比如避免未初始化的变量、编译器警告等。
-
在这种情况下我看不到任何悬空指针。可能存在内存泄漏,但这不一样!悬空指针是指向不再存在的东西的指针,但看不到可能导致这种情况的单个
delete(或任何其他原因)。 -
我希望审阅者也指出使用原始指针管理内存非常糟糕(尤其是当您将它们放入复杂的容器中时);否则,您将调试大量内存泄漏。