我通过一些调试打了一下墙。我在程序中完全不相关的部分遇到了两个Access违规错误,我都不理解。其中一个是在我声明一个新变量时发生的,在本例中是
std::map<float, float> fMap;
我已经检查过该名称在代码中的任何其他地方都没有使用,我不确定这是怎么相关的,但这是我能想到的。我觉得当我用指针做一些愚蠢的事情时,我只能设法产生其中一个。有没有人有什么可能导致这个的想法?该项目正在与Borland 6合作。
谢谢,
答案 0 :(得分:2)
错误与手头的声明无关:很可能是你之前提出的错误的延迟结果。在命中映射声明之前运行的一些代码以某种方式破坏了堆。 可能可能导致“延迟”崩溃的事情是
这些错误可能会立即触发崩溃,但它们通常不会:相反,某些敏感堆结构的损坏部分会等待分配以触发崩溃。当std::map
为其内部分配内存时,它会通过从损坏的堆中请求内存来触发崩溃。
找出答案的最佳方法是使用内存分析工具。它应该在发生时向你指出错误,让你解决问题,而不是追逐它的结果。
答案 1 :(得分:0)
不要使用浮点数作为std :: maps的键,比较运算符在浮点数上效果不佳。你能告诉我其他错误的更多细节吗?
答案 2 :(得分:0)
这肯定是早期错误的结果 - 你做的事情 这是未定义的行为,可能与无效有关 指针或引用,或滥用指针。其中一个最频繁的 原因是在分配的块或写入结束之后写入 通过一个悬空指针(内存已被删除)。这通常可以 非常隐蔽,例如:
std::vector<int> v;
v.push_back(1);
int& r = v[0];
v.push_back(2);
r = 0;
在某些情况下,可以在容器中添加或删除元素 环境(取决于容器的类型)使所有环境无效 引用或指向容器中元素的指针。
回到C时代,最常见的原因之一是分配
strlen
字节,然后strcpy
进入它们。如果您使用的是现代C ++,
你永远不会分配任何数组,也是最常见的原因
可能是插入一个使指针无效的容器,a
引用或仍在使用的迭代器。使用调试
该库的版本将捕获迭代器的问题;工具
像valgrind通常会用指针来捕捉问题
引用。你应该使用两者(以及良好的测试
套件 - 既不会捕获测试中未发生的错误
例)。