zoukankan      html  css  js  c++  java
  • 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;   //正确使用,调用了三次析构函数
    }
    

      

  • 相关阅读:
    第3章 微服务太多,谁来管理
    第1章 微服务初体验
    第2章 构建单个微服务
    【】Spring 5 WebFlux入门
    【】在Spring WebFlux中处理错误
    vbox安装 ubuntu server 后 安装增强包
    mac版beyond compare 4 中对比class文件
    win10 x64 注册ZQDeviceOcx.ocx控件
    Java中多线程重复启动
    关于Java中的反射的一个简单使用
  • 原文地址:https://www.cnblogs.com/lsh123/p/7874737.html
Copyright © 2011-2022 走看看