我声明变量时访问冲突

时间:2012-01-24 14:21:11

标签: c++ c++builder

我通过一些调试打了一下墙。我在程序中完全不相关的部分遇到了两个Access违规错误,我都不理解。其中一个是在我声明一个新变量时发生的,在本例中是

std::map<float, float> fMap;

我已经检查过该名称在代码中的任何其他地方都没有使用,我不确定这是怎么相关的,但这是我能想到的。我觉得当我用指针做一些愚蠢的事情时,我只能设法产生其中一个。有没有人有什么可能导致这个的想法?该项目正在与Borland 6合作。

谢谢,

3 个答案:

答案 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通常会用指针来捕捉问题 引用。你应该使用两者(以及良好的测试 套件 - 既不会捕获测试中未发生的错误 例)。