与此示例中的删除和删除[]有何不同

时间:2014-11-07 05:06:43

标签: c++

int main () {
    char *str = new char[3];

    //delete[] str; // OK
    delete str;  // OK too

    return 0;
}

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

3 个答案:

答案 0 :(得分:0)

是的,在普通删除的情况下确实存在镜头内存泄漏。

匹配组合必须始终为: -

new;    
delete;

new[];
delete[];

答案 1 :(得分:0)

使用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;
}

答案 2 :(得分:0)

对于这个例子,大多数系统可能没有太大区别,但它是UB。使用delete分配的new删除缓冲区会调用UB。

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

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

Live code here