使用指针运算时内存泄漏

时间:2017-11-03 07:35:32

标签: c++ memory-leaks

此类代码是否会导致内存泄漏?

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

2 个答案:

答案 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[]期望获得有关要从提供的指针中删除的元素数量的一些信息,如果传递了不同的指针,它将无法找到。