2

我最近在我的代码中遇到了崩溃,我不确定它是如何以及为什么崩溃并开始使用静态分析器,然后我开始使用 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
4

2 回答 2

5
for(unsigned int i = 0; i < 3; ++i)
        delete [] groups[i];

应该

for(unsigned int i = 0; i < 3; ++i)
        delete  groups[i];

new/delete,new [] /delete []应始终匹配。在您的情况下,使用std::vector<std::shared_ptr<Group> > groups;将是一种更好的方法。

我终于到了一个地步,我的代码中似乎存在“无效的内存访问”,但前提是我的类有析构函数。

usingwrong delete[]是您的应用程序崩溃的原因,在这种情况下,它与您的析构函数无关,除非您的析构函数中隐藏了一些东西,但这将是另一个错误。

于 2012-12-07T06:10:27.957 回答
1

我相信你的问题是你使用的是 array-style delete [],你应该只使用常规的delete. 这是因为其中的每个元素groups都是一个Group对象,而不是它们的数组。

但是,您确实需要使用delete []内存groups

于 2012-12-07T06:11:53.120 回答