声明变量时发生访问冲突

Access violation when I declare a variable

本文关键字:访问冲突 变量 声明      更新时间:2023-10-16

我遇到了一些调试问题。我在程序中完全不相关的部分出现了两个访问违规错误,我都不太理解。其中一个发生在我声明一个新变量时,在本例中是

std::map<float, float> fMap;

我已经检查过这个名字在代码中的其他地方没有使用,我不确定这有什么关系,但这是我所能想到的。我想只有当我用指针做了一些愚蠢的事情时,我才成功地制作出其中一个。有人知道是什么原因造成的吗?该项目正在与Borland6。

谢谢,

错误与手头的声明无关:很可能是您之前犯的错误造成的延迟结果。在命中映射声明之前运行的一些代码以某种方式损坏了堆。可能导致"延迟"崩溃的因素是

  • 正在释放尚未分配给您的内存
  • 多次释放内存
  • 写入已分配给您的内存区域之外

这些错误可能会立即触发崩溃,但通常不会:相反,某个敏感堆结构的损坏部分会等待分配以触发崩溃。当std::map为其内部分配内存时,它会通过从损坏的堆中请求内存来触发崩溃。

最好的方法是使用内存分析工具。它应该在错误发生时向你精确定位,让你解决问题,而不是追求其后果。

不要将浮点用作std::映射的键,比较运算符不能很好地处理浮点。你能给我更多关于其他错误的细节吗?

这肯定是早期错误的结果—你做了什么这是未定义的行为,可能与无效指针或引用,或滥用指针。频率最高的原因是写入超出分配块的末尾或写入通过悬挂指针(内存已删除)。这通常是非常隐蔽,例如:

std::vector<int> v;
v.push_back(1);
int& r = v[0];
v.push_back(2);
r = 0;

在某些情况下,可以从容器中添加或删除元素情况(取决于容器的类型)使所有引用或指向容器中元素的指针。

在C时代,最常见的原因之一是分配strlen字节,然后将strcpy插入其中。如果您使用的是现代C++,你从来没有分配过任何东西的数组,最常见的原因是可能是插入到容器中使指针无效引用或仍在使用的迭代器。使用调试该库的版本将发现迭代器的问题;工具像valgrind一样,通常会用指针和参考文献。你应该同时使用这两种方法(以及良好的测试套房—两者都不会发现测试中没有出现的错误例)。