【发布时间】: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
这样的代码会导致内存泄漏吗?
unsigned char *ptr = new unsigned char[2];
ptr++; //pointer now points to the second member of array
delete [] ptr;
【问题讨论】:
标签: c++ memory-leaks
根据标准(例如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。任何事情都可能发生,包括它似乎工作正常;但这是肯定的不能保证正常工作。
【讨论】:
这是here提到的未定义行为
删除[]表达式
表达式必须是空指针值或先前的指针值 通过 new-expression 的数组形式获得。如果表达式是任何东西 否则,包括如果它是通过非数组形式获得的指针 new-expression,行为未定义。
这是有道理的,因为delete[] 期望从提供的指针中获取有关要删除的元素数量的一些信息,如果传递不同的指针,它将找不到这些信息。
【讨论】: