【发布时间】:2020-04-21 09:45:15
【问题描述】:
考虑:
int *p = new int[10];
linked reply 声明:
注意:即使删除 p; 也可以释放内存,但它只会释放第一个元素的内存。
这听起来像delete p 是可以的。它是否正确?我希望delete p 会导致未定义的行为...
【问题讨论】:
-
内存泄漏不是未定义的行为。
-
这能回答你的问题吗? Should new/new[] match delete/delete[]?
-
动态数组被分配为一块连续的内存。删除块中的一个单元是未定义的行为,维护内存分配很痛苦(即如何将数组的内存单元标记为已删除但保留所有其他单元?)。
-
C++11 第 5.3/2 段:“[...] 在第一种选择(删除对象)中,delete 的操作数的值可能是空指针值,指向由先前的 new 表达式创建的非数组对象,或指向表示此类对象的基类(子句 [class.derived])的子对象([intro.object])的指针。如果不是,则行为未定义。 [...]"
-
UB 使用的
delete版本与new不匹配。
标签: c++ dynamic-arrays