从动态创建的缓冲区中删除子缓冲区

Ani*_*753 1 c++

char* ptr = new char[512]; // also malloc() can be used
ptr = ptr + 10;
delete[] ptr; // free() if memory allocated by malloc
Run Code Online (Sandbox Code Playgroud)

正如我们所知,在分配内存时new和malloc在某处保存了分配的内存大小(在哪里?取决于编译器的实现).在释放内存时,delete和free()使用此保存的大小值.在我的情况下,我将起始指针移动了10个字节.我的问题是:内存泄漏的情况?未定义的行为?或者它会尝试在512之后释放下一个额外的10个字节?

thi*_*his 11

这是未定义的行为,您必须释放或删除相同的指针.

来自ISO/IEC 9899:201x:

7.22.3.3自由功能

free函数导致ptr指向的空间被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义.

关于未定义的行为:

3.4.3(1)未定义的行为:

使用不可移植或错误的程序结构或错误数据时的行为,本国际标准不对此要求

  • @ Anil8753:关于未定义行为的最佳效果是您的程序立即崩溃.另一方面,您可以在调试器中花费数天或数周的时间来弄清楚为什么内存会被巧妙地破坏,在此期间您的女朋友会离开您并且您的狗会死亡. (4认同)
  • 一些解释.什么样的未定义行为是可能的? (3认同)
  • @ Anil8753嗯......这是未定义的行为.这意味着没有可能未定义行为的"种类"列表.它是未定义的. (3认同)