delete和delete[]以及函数作为左值的记录

        今天在回看老师的PPT的时候,发现不大清楚delete和delete[]的区别了,于是我查了一下别人对此的解释,为了避免再次忘记,做一个记录,还有包括函数作为左值的问题,这个已经不是一次不懂了:

         早在结构化编程的时候,老师讲过,delete和delete[]上是没有区别的,就像int *p=new int [20],在此处,delete p与delete[] p的效果是一样的,都可以在堆上释放该部分空间。

但是在面向对象编程时,比如涉及到对象,delete和delete[]就是有区别的了,大概看了一下别人的讲解,下面是试了一下的例子

<T.h>

#include<iostream>
using namespace std;
class T{
public:
    T(){
    cout<<"call the constructor"<<endl;
    }
    ~T(){
        cout<<"call the destructor"<<endl;
    }
};

<main.cpp>

#include"T.h"
using namespace std;

int main()
{
    T *a=new T();
    delete a;
    T *c=new T[10];
    delete[] c;


    return 0;
}//此处delete[]的结果是,调用了10个T类型对象的析构函数,堆内存也释放了
#include"T.h"
using namespace std;

int main()
{
    T *a=new T();
    delete a;
    T *c=new T[10];
    delete c;


    return 0;
}//此处delete的结果是,调用了1个对象的析构函数,即"call the destructor"只打印了一遍,但是在堆内存依然释放了,但是如果T中存在动态分配空间,那部分空间没有被释放

所以若是在T的成员变量中分配了动态分配的资源,若是第二种情况就会造成内存泄露。这就是delete和delete[]的区别。

delete[]之所以可以释放一组内存空间是因为在首地址的之前地址有cookie,记录需要删除的长度


二、函数为什么可以作为左值
函数作为左值被赋值是当函数的返回值为引用的时候,而且引用不是const类型。

 C++语言的函数返回值类型可以分为内部类型和自定义类型两大类。
    在函数返回内部类型中不能返回数组类型但可以返回指向数组的指针,同样也可以返回指向函数的函数指针。如果希望返回值可以作为左值(即可以放在赋值操作符左边的)那就必须返回引用类型。
    而在函数返回自定义类型(即返回类类型)中根据是否可作为左值,返回值是否可调用成员函数的不同可分为以下四种情况。
    T:返回类类型

  1. T f();
  2. const T f();
  3. T& f();
  4. const T& f();
    T f(); 返回一般的类类型,返回的类类型不能作为左值,但返回的类类型可以直接调用成员函数来修改,如function().set_Value(); 返回类类型调用复制构造函数。
    const T f(); 此种类型与上述第一种相同,唯一不同的是返回的类类型不能调用成员函数来修改,因为有const限定符。
    T& f(); 返回类的引用可以作为左值,并且返回的类类型引用可以直接调用成员函数来修改,返回的类类型不会调用复制构造函数。

    const T& f(); 不能作为左值,不能调用成员函数修改,不会调用复制构造函数。--------来源他人博客

返回引用的函数返回一个左值。因此,这样的函数可用于任何要求使用左值的地方

 

注意:不要返回一个局部变量的引用

返回引用的函数返回一个左值。因此,这样的函数可用于任何要求使用左值的地方

这里还有一个关于函数作为左值的例子-----来源csdn论坛查看

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值