问题标签 [stdmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
90824 浏览

c++ - 如何使用迭代器删除 std::map 的元素?

我想std::map根据内容循环并删除项目。这将如何做到最好?

0 投票
1 回答
916 浏览

c++ - 为什么多态类型错误和清理问题?

错误是“'dynamic_cast':'base' 不是多态类型”。应该怎么做才能解决这个问题?方式 1 和方式 2 是否都已正确清理?

0 投票
2 回答
3614 浏览

c++ - std::map 是否需要初始化?

我有一个单身人士,那是一个图像管理器。当我尝试加载图像时,我以这种方式调用单例:

并且,在 loadFromFile 方法中,我将图像存储到地图中:

问题是我收到内存访问错误。就像如果 m_imageMap 为 NULL o 初始化错误,因为在第一句中抛出异常。但正如我所说,是一个单例,所以我必须初始化地图。我在 VC++ 2008 中开发。它可能是一个错误的编译/.obj 文件?

昨天运行良好

一些忠告?

编辑: m_imageMap 的声明非常简单:

作为附加信息,生成的异常位于文件 output.c 的第 1643 行。

编辑好吧,我对这个案子非常失望。我已经更改了代码,所以现在该类不再是单例了。现在只有 m_imageMap 是静态的,可以让所有加载的图像在任何地方都可见。但仍然以同样的方式失败。该错误是访问冲突。此外,如果我通过此代码更改所有方法代码:

仍然失败。就像地图为空或以任何方式锁定,甚至初始化错误,但我不知道。你可以帮帮我吗?

如果您需要更多代码,我会粘贴,但我认为这三行代码崩溃会简化问题。

编辑:终于解决了最后我改变了

现在它可以工作了。现在我只需要考虑一个删除静态 std::map 指针内容的方法。

非常感谢大家

0 投票
7 回答
3030 浏览

c++ - 我需要删除静态 std::map 吗?

在某些类中,我有一个内部带有指针的静态 std::map。我的问题是我是否需要在程序结束时删除或自动释放此内存。我担心的是,当 std::map 被删除时,存储在里面的指针是否通过我们的析构函数被正确删除。

谢谢。

0 投票
2 回答
2093 浏览

c++ - std::map operator[] 如何导致基本数据类型的内存泄漏?

我正在使用Visual Leak Detector来检测内存泄漏,并且在行中遇到了许多内存泄漏实例,例如:

这怎么可能?这里没有指针,没有对象实例化。

可能是由于其他原因导致程序崩溃的副作用的内存泄漏?程序崩溃或退出(1)会导致地图没有被彻底破坏吗?

0 投票
1 回答
217 浏览

c++ - 为什么带有指向模板函子的指针作为 value_type 的 Map 不起作用?

当我尝试创建一个值类型为指向模板函子的指针的 std::map 时,Visual Studio 出现问题。我在这里做违法的事吗?

有人可以告诉我这是一个错误(以及为什么这是错误的)还是只是 Visual Studio?

0 投票
3 回答
887 浏览

c++ - 避免在没有原始指针的情况下复制地图的键

每次您在键为 std::string 的 std::map 中插入一对时,它都会生成两个副本。您可以避免使用原始指针,但它是异常不安全的。有没有办法使用智能指针而不是原始指针?

示例代码:

输出:

0 投票
3 回答
2275 浏览

c++ - std::map 节点对齐

我正面临着一件非常了不起的事情。(场景:Win7 pro 64位,VC2008编译32位代码)

假设一个主程序实例化一个使用 std::map 的类。
这是一个 std::map<std::string,Props> 类 Props 只有两个成员:

现在...我构建了一个 DLL,为它自己的业务使用相同的类。
DLL 实例化该类并提供 std::map。

嗯...当主程序提供地图时一切正常,而 DLL 在第一个项目插入后崩溃。

更多(非常有趣)的东西。
如果我深入到由主程序完成的插入,我将单个 _Node 的构造函数放入 std::map
_Node 显示如下(c:\Programmi\Microsoft Visual Studio 9.0\VC\include\xtree)

很好……所以我们的 _Node 结构有 _Left(4 字节)、_Parent(4 字节)、_Right(4 字节)、_Myval(地图的键和值的大小)、_Color(1 字节)和 _Isnil(1 字节)。
现在...我要为地图提供的元素是一对 <std::string, Props>。
根据我的调试器,std::string 需要 0x20 个字节,而 Props 只需要 8 个。

现在,当我询问调试器单个节点的大小时,我可以看到它是 0x38。所以...0x4 + 0x4 + 0x4 + 0x20 + 0x8 + 0x1 + 0x1 = 0x36 + 填充 = 0x38。
这意味着 _Color 成员在 _Node 开始后的 0x34 字节处开始。

(好吧...我宁愿指定我所有的项目都使用 /Zp4 所以所有结构都是 4 字节打包)。

让我们继续...当我遵循 DLL 行为时,我可以看到一些非常惊人的东西。
std::map 的 _Buynode() 方法调用分配器为我要插入的新元素设置新的大小。调用分配器而不是调用 _Node() 就地构造函数....并且它以另一种方式起作用!!

在这种情况下,构造函数表现为 _Color 成员在 _Node 开头的 0x38 字节之后开始......好像有不同的填充一样。
在此之后,在以下尝试插入新值时,该过程失败,因为 _Color 和 _Isnil 的值......错误(0xcc,因为该部分内存未初始化)。

我确定我在所有项目中都将 /Zp4 设置为解决方案,所以......
怎么了?
我“感觉”对齐有问题,但我不能说什么......

提前致谢!


好的...我要添加更多内容。
这是来自 c:\Programmi\Microsoft Visual Studio 9.0\VC\include\xtree 的 _Node 结构

如您所见,它的构造函数非常简单。
当我按照我之前所说的那样查找 std::map 时,查看从这个结构中使用的内存。
- _Left
4 个字节 - _Parent 4 个字节 - _Right
4 个字节
- _Myval 0x28 个字节(std::string 为 0x20,我自己的类为 8 个。我检查过,它总是 8 个字节)
- _Color 1 个字节
- 1 _Isnil 的字节

当一个新元素放置在树的顶部(我的意思是最左边的)被创建时,这个 costructor 填充 _Left、_Parent、_Right、_Myval,而不是 lat 4 个未初始化的字节(比如填充 0xcc)并填充它认为应该是 _Color和 _Isnil 提前 4 个字节。
最荒谬的是 std::map 的其他方法不会“感觉”这 4 个字节。
这些是导致 de 断言的行。

发生这种情况是因为对 _IsNil(_Ptr) 的测试发现 _Isnil 为 0xcc,并给出了错误。发布版本可能不疯,这不是一件快乐的事。

任何想法?


又一步!
我把整个解决方案(2个大项目,18个小项目,大约250000个C/C++代码行),在Linux下编译(gcc4.1.2)。
一切都很好。完全没有问题,std::map 可以正常工作。
我不得不说 Linux Makefile 同时让一切变得更加简单和复杂。复杂是因为你必须自己做所有事情,简单是因为如果你不想做就什么都不会发生。

这告诉我一件事:Visual Studio 2008 中存在一些问题,在某些特定条件下会跳到舞台上……问题是“导致这种情况的条件是什么?”。

等待一个想法...

0 投票
2 回答
913 浏览

insert - std::map::insert 麻烦

我有非常简单和愚蠢的麻烦:

编译器说:

TakeAction.cpp:43 它是插入调用的行。为了好玩,我接下来尝试了:

全部都一样。
我很困惑,请解释一下,这是怎么回事?

0 投票
1 回答
6599 浏览

c++ - 使用运算符 [] 时的 std::map 段错误

我有一个奇怪的问题。我正在使用内部引用 std::map 的工厂注册模式。我将这种方法用于多个组件,并且注册发生在不同编译单元(又名 .cpp 文件)的多个点。这发生在静态变量初始化时(在调用“main”之前)。出于某种奇怪的原因,当我提到

map[key] = value;

(基本上当我注册一个特定的 pfn 时)。现在,如果我在同一个编译单元中移动特定麻烦组件的注册,一切正常。同样,如果我只将一个组件的注册移开,我就会得到一个段错误。

我不得不说,这不是我第一次使用这种模式,它适用于其他组件的相同可执行文件(即,分布在多个 .cpp 中的另一种工厂类型的组件在初始化时注册没有问题,使用基本相似的源代码) .

我该怎么办?现在我已经将组件的注册留在了同一个 .cpp 中(并且它完美地工作)。我怎样才能更好地调查?

我正在使用 g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

在堆栈跟踪下方