【问题标题】:Memory leaks when using pointer arithmetic使用指针算术时内存泄漏
【发布时间】:2017-11-03 07:35:32
【问题描述】:

这样的代码会导致内存泄漏吗?

unsigned char *ptr = new unsigned char[2];
ptr++; //pointer now points to the second member of array
delete [] ptr;

【问题讨论】:

  • 我怀疑这甚至是一种已定义的行为。

标签: c++ memory-leaks


【解决方案1】:

根据标准(例如this在线草稿版),delete-ing 指针的行为是未定义的:new 以前没有获得过:

3.7.4.2 释放函数

(3) 如果释放函数因抛出异常而终止,则 行为未定义。提供给 a 的第一个参数的值 释放函数可能是一个空指针值;如果是这样,如果 释放函数是标准库中提供的一个函数, 调用没有效果。 否则,如果值为 提供给标准库中的 operator delete(void*) 不是一个 先前调用任一运算符返回的值 new(std::size_t) 或 operator new(std::size_t, const std::nothrow_t&) 在标准库中,如果值为 提供给标准库中的操作员删除不是 先前调用任一运算符返回的值之一 new 或运算符 new[](std::size_t, const std::nothrow_t&) 在标准库中。

ptr+1 的值不是new[] 返回的值,因此对delete[] (ptr+1) 的调用是UB。任何事情都可能发生,包括它似乎工作正常;但这是肯定的不能保证正常工作

【讨论】:

  • 非常感谢。这是否意味着我必须避免对 new 获得的指针进行指针运算?
【解决方案2】:

这是here提到的未定义行为

删除[]表达式

表达式必须是空指针值或先前的指针值 通过 new-expression 的数组形式获得。如果表达式是任何东西 否则,包括如果它是通过非数组形式获得的指针 new-expression,行为未定义。

这是有道理的,因为delete[] 期望从提供的指针中获取有关要删除的元素数量的一些信息,如果传递不同的指针,它将找不到这些信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2015-12-15
    相关资源
    最近更新 更多