类和对象(9)—— new和delete

对象动态建立和释放 new 和delete

  在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。

               new和delete是运算符,不是函数,因此执行效率高。                


 

        虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。

new int;//开辟了一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
new int[5][4];//开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p = new float(3.14158);//开辟一个存放单精度数的空间,并指定该实数的初值为3.14158,将返回该空间的地址赋给指针变量p

 new运算符动态分配堆内存

使用形式:指针变量=new 类型(常量);

     指针变量=new 类型[表达式];

作用:从堆分配一块“类型”大小的存储空间,返回首地址

其中:“常量”是初始化值,可缺省

   创建数组对象时,不能为对象指定初始化值

delete运算符释放已分配的内存空间

使用形式:delete 指针变量;

     delete[] 指针变量;

其中:“指针变量”必须是一个new返回的指针

  用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。

malloc不会调用类的构造函数,而new会调用类的构造函数;

free不会调用类的析构函数,而delete会调用类的析构函数。

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//C语言中
void test1()
{
    int *p = (int*)malloc(sizeof(int));
    *p = 10;
    if (p != NULL);
    {
        free(p);
        p = NULL;
    }

     int *array_p = (int*)malloc(sizeof(int) * 10);//数组

    for (int i = 0; i < 10; i++)
    {
        array_p[i] = i + 1;
    }
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", array_p[i]);
    }
    printf("\n ");
}

//C++语言中
void test2()
{
    int *p = new int;
    *p = 10;
    if (p != NULL)
    {
        delete p;
        p = NULL;
    }

    int *array_p = new int[1for (int i = 0; i < 10; i++)
    {
        array_p[i] = i + 1;
    }
    for (int i = 0; i < 10; i++)
    {
        cout << array_p[i] << " " ;
    }
    cout << endl;

    if (array_p!= NULL)
    {
        delete[] array_p;
    }
}

int main(void)
{
    test1();
    cout << "-----------------------" << endl;

    test2();

    return 0;
}

 

posted @ 2018-10-16 16:41  悦悦的小屋  阅读(954)  评论(0编辑  收藏  举报