我最近在我的代码中遇到了崩溃,我不确定它是如何以及为什么崩溃并开始使用静态分析器,然后我开始使用 Intel Inspector XE 2013。我一直在我的代码中遇到相同的“无效内存访问”所以我开始将我的代码减少到尽可能小的形式以使其重现,在那里我终于达到了我的代码中似乎存在“无效内存访问”的地步,但前提是我的类有析构函数。有趣的是,我的“无效内存访问”发生在它试图删除的地址之前的地址上。最终出现“无效内存访问”的代码实际上并没有使我的代码崩溃,但我想我会解决这个潜在的问题,以防它产生滚雪球影响。我有问题的代码是
class Group {
public:
Group() {}
~Group() {} // When this line is not here, there will not be an "Invalid memory access"
};
int main() {
Group** groups = new Group*[3];
groups[0] = new Group();
groups[1] = new Group();
groups[2] = new Group();
for(unsigned int i = 0; i < 3; ++i)
delete [] groups[i];
delete [] groups;
return 0;
}
“无效内存访问”问题将在第一次尝试“删除 [] 组 [i]”时被标记(因此 i 将等于 0)。它被标记的内存地址是“0x003e30ec”,其中 group[0] 实际上是“0x003e30f0”,即提前 0x4。每当我运行此测试时,它始终保持 0x4 的差异。
我的问题是,在我不正确地读取或写入内存的情况下,我的代码实际上是否有任何问题,或者这个人只是 Intel Inspector XE 2013 的不良结果(我在 Visual Studio 2012 Update 1 上)?
对于那些对我上面的例子的内存表感到好奇的人,它如下
groups == 0x003e30b8
groups[0] == 0x003e30f0
groups[1] == 0x003e3120
groups[2] == 0x003e3150