此类代码是否会导致内存泄漏?
unsigned char *ptr = new unsigned char[2];
ptr++; //pointer now points to the second member of array
delete [] ptr;
答案 0 :(得分:2)
根据标准(例如this在线草案版本),未delete
之前尚未获得的new
指针的行为未定义:
3.7.4.2释放函数
(3)如果通过抛出异常终止释放函数,则 行为未定义。提供给a的第一个参数的值 deallocation函数可以是空指针值;如果是的话,如果是的话 解除分配函数是标准库中提供的函数 通话没有效果。 否则,如果值,则行为未定义 提供给标准库中的operator delete(void *)不是一个 先前调用任一运算符返回的值的值 new(std :: size_t)或operator new(std :: size_t,const std :: nothrow_t&) 在标准库中,如果值,则行为未定义 提供给标准库中的operator delete不是 上一次调用任一运算符返回的值之一 new或operator new [](std :: size_t,const std :: nothrow_t&)在标准库中。
ptr+1
的值不是new[]
返回的值,因此对delete[] (ptr+1)
的调用是UB。任何事情都可能发生,包括它似乎正常工作;但肯定无法保证正常工作。
答案 1 :(得分:1)
这是here
提到的未定义行为删除[]表达式
表达式必须是空指针值或之前的指针值 通过new-expression的数组形式获得。如果表达是什么 否则,包括它是否是由非数组形式获得的指针 new-expression,行为未定义。
这是有道理的,因为delete[]
期望获得有关要从提供的指针中删除的元素数量的一些信息,如果传递了不同的指针,它将无法找到。