我最近在我的代码中发生了崩溃,我不知道它是如何以及为什么崩溃并开始使用静态分析器,然后我开始使用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;
}
第一次尝试“delete [] group [i]”时会标记“Invalid memory access”问题(所以我将等于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
答案 0 :(得分: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;
将是一种更好的方式。
在那里我终于找到了一个似乎有一个点的地方 我的代码中的“内存访问无效”,但仅当我的类有一个 析构函数。
使用wrong delete[]
是您的应用程序崩溃的原因,在这种情况下它与析构函数无关,除非您的析构函数中隐藏了一些东西,但这将是另一个错误。
答案 1 :(得分:1)
我相信您的问题是您使用的是阵列式delete []
,而您应该只使用常规delete
。这是因为groups
中的每个元素都是一个Group
对象,而不是它们的数组。
但是,您需要将delete []
用于groups
内存。