【问题标题】:Is there actually an invalid memory acess in my code?我的代码中实际上是否存在无效的内存访问?
【发布时间】:2012-11-25 07:41:50
【问题描述】:

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

【问题讨论】:

  • 你用错了delete。下次使用智能指针向量(假设您确实需要指针)。

标签: c++ memory destructor inspector


【解决方案1】:
for(unsigned int i = 0; i < 3; ++i)
        delete [] groups[i];

应该是

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

new/deletenew [] /delete [] 应该始终匹配。在您的情况下,只需使用 std::vector&lt;std::shared_ptr&lt;Group&gt; &gt; groups; 会是更好的方法。

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

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

【讨论】:

  • 在有析构函数的情况下使用不正确的delete[]导致内存访问无效的关系是什么?
  • 不是因为析构函数,而是因为你new一个对象和delete []是UB
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多