在这个例子中,与删除和删除[]有什么区别

What is difference from delete and delete[] in this example

本文关键字:删除 区别 什么      更新时间:2023-10-16
int main () {
    char *str = new char[3];
    //delete[] str; // OK
    delete str;  // OK too
    return 0;
}

我知道我需要为新的 [] 调用 delete[]。但是,这个"删除str"通过编译。在这种情况下,"删除str"中是否存在内存泄漏?

对于此示例,大多数系统上可能没有太大区别,但它是 UB。使用分配了newdelete缓冲区删除缓冲区将调用 UB。

但是,如果char被某个类替换,delete[]可以保证调用所有对象的析构函数,而delete可以只调用obj[0]析构函数,这可能会导致资源泄漏或其他一些不需要的问题。

结论:这是UB,所以永远不要这样做。

实时代码在这里

是的,在普通删除的情况下,肯定会发生内存泄漏。

匹配组合必须始终为:-

new;    
delete;
new[];
delete[];

分配了new[]的内存应与delete[]一起删除 - 否则会泄漏内存。即

int main () {
    char *str = new char[3];
    delete[] str;  // OK
    char *str2 = new char;
    delete str2;  // OK
    char *str3 = new char[3];
    delete str3;  // Not OK
    char *str4 = new char;
    delete[] str4;  // Not OK
    return 0;
}