我的代码中是否存在无效的内存访问?

jud*_*rke 2 c++ memory destructor inspector

我最近在我的代码中遇到崩溃,我不知道它是如何以及为什么崩溃并开始使用静态分析器,然后我开始使用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;
}
Run Code Online (Sandbox Code Playgroud)

"无效内存访问"问题将在第一次尝试"delete [] group [i]"时被标记(因此我将等于0).它是一个标记在所述存储器地址是"0x003e30ec",其中作为组[0]实际上是"0x003e30f0",这是前面为0x4.每当我运行这个测试时,它总是在0x4的差异.

我的问题是,我的代码实际上是否存在任何错误,我正在不正确地阅读或写入内存,或者这个人只是英特尔Inspector XE 2013的糟糕结果(我在Visual Studio 2012 Update 1上)?

对于那些对我上面的例子的内存表感兴趣的人,它是以下内容

groups == 0x003e30b8
groups[0] == 0x003e30f0
groups[1] == 0x003e3120
groups[2] == 0x003e3150
Run Code Online (Sandbox Code Playgroud)

bil*_*llz 5

for(unsigned int i = 0; i < 3; ++i)
        delete [] groups[i];
Run Code Online (Sandbox Code Playgroud)

应该

for(unsigned int i = 0; i < 3; ++i)
        delete  groups[i];
Run Code Online (Sandbox Code Playgroud)

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

在我的代码中似乎存在"无效的内存访问"但我的类中有一个析构函数的地方.

使用wrong delete[]就是为什么你的应用程序崩溃,它无关,与你的析构函数在这种情况下,除非你有什么藏在你的析构函数,但是这将是另一个bug.