首页技术文章正文

C++学习10:使用new分配内存【黑马web前端】

更新时间:2019年07月26日 13时50分34秒 来源:黑马程序员论坛

在C++中,可以沿用C中的malloc分配内存,也可以使用new运算符。今天就来学习使用new分配内存。

new的作用和使用方法:

new的作用在于可以在程序运行阶段动态分配内存,内存的大小在运行时根据需要确定,从而高效利用内存空间。

new的使用方法如下:

typeName* pointer_name = new typeName
1
2
使用时用户需要指定类型(指针类型和要开辟的内存存储的数据类型),new可以自动找到一个正确长度的内存块,并返回内存块的地址。分配内存失败时,默认抛出bad_alloc异常。

比如:

int* p = new int;
1
这里指定了int型,new会自动找到适合存储int的内存,将地址返回赋给指针p。

此时,使用new开辟的内存块只能通过指针p来访问,这块内存是未命名的。

要注意一点:new分配的内存位于堆(heap)或自由存储区(free store)中,而常规变量分配的内存是在栈(stack)中。堆和栈的区别在于:栈(stack)由编译器自动分配释放,而堆(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

在使用new时,释放内存的方法就是delete。

使用delete释放内存

delete可以释放内存供其他部分使用。方法十分简单,在delete后加指向待释放内存的指针即可,比如:

    int* p = new int;
    delete p;

这样就可以释放掉通过new为开辟的内存了。

需要注意的是,delete只能释放由new开辟的内存。注意以下三种情况:
1、如果试图释放常规变量声明分配的内存,会报错。如:

    //delete不能释放常规变量声明分配的内存
    int i =3;
    int* p = &i;

2、如果试图释放已被delete释放的内存,会报错。如:

    //delete释放后,p指针不会被删除,而是重新指向了一处新的地址。
    int* p = new int;
    delete p;
    delete p;

3、delete可以释放空指针,这是安全的,不报错。如:

    int* p = NULL;
    delete p;
    delete p;

使用new创建动态数组

之前说了,new可以在运行时动态分配内存,这一作用的具体体现就是创建动态数组。
如:

int data[100]={0};
1
这里声明一个int型数组,长度为100,其内存空间在编译时已经分配好了。无论这个数组在实际运行中使用了多少,总是会占用那部分内存空间。

而如果使用new创建动态数组:

int* p = new int [100];   //p指向动态数组的首地址
1
其内存是在运行时在分配的,当不使用时可以使用delete释放掉。释放动态数组时需要加[]:

    int* p = new int [100];
    delete [] p;

如果不加[],但不会报错,结果是不确定的,不要这样做。

这里贴一个c++ primer plus中的一个例子,个人感觉十分巧妙。

#include<iostream>  
#include<cstring>

using namespace std;  
char* getname(void);

int main(void)  
{   
    char* name;
    name = getname();
    cout << "The length of " << name << " is " << strlen(name) << endl;
    delete [] name;

    name = getname();
    cout << "The length of " << name << " is " << strlen(name) << endl;
    delete [] name;

    system("pause");
}  

char* getname()
{
    char temp[80];
    cout << "Enter last name: ";
    cin >> temp;
    char* pn = new char[strlen(temp)+1];
    strcpy(pn, temp);

    return pn;
}


可以看到,动态数组实际是在getname函数中建立的。通过临时字符数组temp存储输入的字符串,通过strlen(temp)+1计算需要的字符串长度提供给new,实现开辟对应大小的内存空间,并通过strcpy(pn, temp)将字符串复制到新开辟的内存处。

这样做可以每次都创建刚好能够存储输入字符串的内存块,在读取大量字符串的程序中,可以节省大量内存。

需要注意的是,这里new和delete放在了不同的函数中,这样是可以的,但容易忘记delete。

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!