int main () {
char *str = new char[3];
//delete[] str; // OK
delete str; // OK too
return 0;
}
我知道我需要为new []调用delete []。但是,这个“删除str”通过了编译。在这种情况下,“delete str”中是否有内存泄漏?
答案 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,所以永远不要这样做。