在这个例子中,与删除和删除[]有什么区别
What is difference from delete and delete[] in this example
int main () {
char *str = new char[3];
//delete[] str; // OK
delete str; // OK too
return 0;
}
我知道我需要为新的 [] 调用 delete[]。但是,这个"删除str"通过编译。在这种情况下,"删除str"中是否存在内存泄漏?
对于此示例,大多数系统上可能没有太大区别,但它是 UB。使用分配了new
的delete
缓冲区删除缓冲区将调用 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;
}
相关文章:
- 将数组的地址分配给变量并删除
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- int(c) 和 c-'0' 之间的区别。C++
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 当两者都调用时,删除和析构函数之间的区别?
- 删除[i] 数组和删除数组 [i] 之间的区别
- 两次删除链表有什么区别?
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 删除指针并将指针设置为null之间有什么区别
- 不实现和删除常用运算符有什么区别
- 标准::删除和擦除矢量之间的区别
- 在这个例子中,与删除和删除[]有什么区别
- 删除和自由在C++中有什么区别,C++的默认析构函数调用哪一个?
- 为什么隐式和显式删除的move构造函数被区别对待
- 删除指针和将其设置为 nullptr 有什么区别?