delete和delete[] 区别
// DeleteAndDelete[].cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
/*
delete ptr 只用来释放ptr指向的内存。
delete[] ptr 用来释放rg指向的内存,并且逐一调用数组中每个对象的析构函数 所以对于像int/char/long/int/struct基本数据类型,由于他们没有析构函数,所以用delete 和delete[]都能够安全地释放内存,并没有区别。
但是如果是C++对象数组就不同了,对于对象数组使用delete释放,只能够调用一次析构函数,程序崩溃
对于对象数组使用delete[]释放,则会调用数组大小对应的析构函数,内存安全双方(Sub_5验证)
*/ void Sub_1();
void Sub_2(); void Sub_3();
void Sub_4(); void Sub_5(); class TestClassA
{
private:
char *m_cBuffer;
int m_nLen = 1;
public:
TestClassA() { m_cBuffer = new char[m_nLen]; }
~TestClassA() { delete[] m_cBuffer; }
}; class TestClassB
{
public:
TestClassB()
{
cout << "构造函数哈构造函数" << endl;
}
~TestClassB()
{
cout << "析构函数哈析构函数被调用了几次呢?" << endl;
}
}; int main()
{
/*基本数据类型的delete 和 delete[],没有区别,都能安全释放*/
//Sub_1();
//Sub_2();
//Sub_3();
//Sub_4();
Sub_5();
return 0;
} void Sub_1()
{
int *v1 = new int[10];
delete v1;
} void Sub_2()
{
int *v1 = new int[10];
delete[] v1;
} //内存泄漏!崩溃
void Sub_3()
{
TestClassA *v1 = new TestClassA[10];
delete v1;
//仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数
//剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
} void Sub_4()
{
TestClassA *v1 = new TestClassA[10];
delete[] v1;
//仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数
//剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
} void Sub_5()
{
//TestClassB* v1 = new TestClassB[3];
//delete v1; //只调用一次析构函数,崩溃
TestClassB* v2 = new TestClassB[3];
delete[] v2; //正确使用,调用了三次析构函数
}
delete和delete[] 区别的更多相关文章
- sql之truncate 、delete与drop区别
sql之truncate .delete与drop区别相同点:truncate 和不带 where 子句的 delete,以及 drop 一定会删除表内的数据不同点:1. truncate 和 del ...
- 【转】 C++中delete和delete[]的区别
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...
- sql中truncate 、delete与drop区别
SQL truncate .delete与drop区别 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL ...
- C++ 中 delete 和 delete[] 的区别
一直对 C++ 中 delete 和 delete[] 的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++ 告诉我们在回收用 new 分配的单个对象的内存空间时用 de ...
- SQL truncate 、delete与drop区别
SQL truncate .delete与drop区别 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句 ...
- delete与delete[]的区别
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...
- new malloc和delete free 的区别
今天看了一个面试题:问new 和 malloc, delete 和 free 的区别,扭捏了半天,也没说完全:现总结如下: 1.先看看new 和 delete 看一个例子: <span styl ...
- delete和delete[]的区别(转载)
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...
- new和malloc区别,delete和delete []区别
面试被问到上述问题,所以特地总结一下: 一.new和malloc的区别. 1.new可以返回指定类型的指针,并且自动分配内存大小:malloc需要计算手动计算分配空间的大小,并且返回值需要强转为实际类 ...
- delete 和 delete [] 的真正区别
c++中对new申请的内存的释放方式有delete和delete[两种方式,到底这两者有什么区别呢? 1.我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指向的内存 de ...
随机推荐
- PHP单例模式 demo
<?php class single{ static public $db; private function __construct(){ }; static function getinst ...
- python-flask-配置文件的源码分析
方式一:app.config['xx'] = 'xxx'源码分析:#第1步:class Flask(_PackageBoundObject): self.config = self.make_c ...
- python-flask-SQLAlchemy
SQLAlchemy 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使 ...
- Boosting
Boosting is a greedy alogrithm. The alogrithm works by applying the weak learner sequentially to wei ...
- echarts3使用总结2
接着上一篇文章补充一点项目中遇到的问题及解决方法 1.y轴正负轴调换 yAxis: { inverse: false, //y轴正负轴调换 }, 2.去掉图表背景线 yAxis: [ ...
- 解决VS Code保存时候自动格式化
VS code 保存会自动格式化.以前都是alt+shift+F格式化的,现在一保存就格式化 解决方式:找到你的VScode扩展,把JS-CS-HTML Formatter这个插件禁用就可以解决
- ASP.NET MVC命名空间时引起错误的解决方法
使用VS2012新建了一个Asp.net mvc5的项目,并把项目的命名空间名称更改了(Src更改为UXXXXX),然后就导致了以下错误 刚开始以后是项目的属性中的命名空间没有更改过来的问题,但我在重 ...
- [LeetCode] 23. Merge k Sorted Lists ☆☆☆☆☆
转载:https://leetcode.windliang.cc/leetCode-23-Merge-k-Sorted-Lists.html 描述 Merge k sorted linked list ...
- [LeetCode] 295. Find Median from Data Stream ☆☆☆☆☆(数据流中获取中位数)
295. Find Median from Data Stream&数据流中的中位数 295. Find Median from Data Stream https://leetcode.co ...
- linux使用lvresize和resize2fs调整lv大小
以下操作基于场景:有两个同vg的lv(applv和rootlv),我们需要从applv腾出1G给rootlv. 1.缩小applv磁盘 lvresize -L -1G /dev/mapper/myvg ...