指针和自由存储空间复习(重点复习new和delete)

指针和自由存储空间复习(重点复习new和delete)

使用new来分配内存

在运行阶段分配未命名的内存以存储值
为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:typeName * pointer_name = new typeName;
需要在两个地方指定数据类型:用来指定需要什么样的内存和用来声明合适的指针。

使用delete释放内存

一定要配对地使用new和delete
使用delete时,后面要加上(最初是由new分配的)指向内存块的指针。

int* ps=new int;
...
delete ps;

这将释放ps指向的内存,但不会删除指针ps本身。(可将ps重新指向另一个新分配的内存块)

使用new来创建动态数组

将数组的元素类型元素数目告诉new即可。
int* psome=new int [10];//创建一个包含10个int元素的数组
new运算符返回第一个元素的地址
当程序使用完new分配的内存块时,应使用delete释放它们。(如果使用new时不带方括号,使用delete时也不带方括号;如果使用new时带方括号,使用delete时也带方括号)
delete [] psome;

使用new和delete时,应遵循以下规则:

·不要使用delete来释放不是new分配的内存
·不要使用delete释放同一个内存块两次
·如果使用new[]为数组分配内存,则应使用delete[]来释放
·如果使用new为一个实体分配内存,则应使用delete(没有方括号)来释放
·对空指针应用delete是安全的


使用动态数组

把指针当作数组名使用即可

//arraynew.cpp
#include <iostream>
int main()
{
    using namespace std;
    double* p3=new double [3];
    p3[0]=0.2;
    p3[1]=0.5;
    p3[2]=0.8;
    cout<<"p3[1] is "<<p3[1]<<".\n";
    p3=p3+1;//使p3指向第2个元素而非第1个元素
    cout<<"now p3[0] is "<<p3[0]<<",p3[1] is "<<p3[1]<<".\n";
    p3=p3-1;
    delete []p3;
    return 0;
}

使用new创建动态结构

创建结构:

structName * pointer_name = new structName;
例如inflatable * ps = new inflatable;

访问成员:

因为动态创建的结构没有名称,所以不能使用成员运算符句点.
一种访问结构成员的方法是使用而箭头成员运算符->。(ps->price)
另一种访问结构成员的方法是(*ps).price

一个使用new和delete的示例

定义一个函数getname(),该函数返回一个指向输入字符串的指针。该函数将输入读入到一个大型的临时数组中,然后使用new[]创建一个刚好能够存储该输入字符串的内存块,并返回一个指向该内存块的指针。

//delete.cpp
#include <iostream>
#include <string.h>//or csting
using namespace std;
char* getname(void);//function prototype

int main()
{
    char *name;//create pointer but no storage
    name=getname();//assign adress of string to name
    cout<<name<<" at "<<(int*)name<<"\n";
    delete []name;//memory freed

    name=getname();//reuse freed memory
    cout<<name<<" at "<<(int*)name<<"\n";
    delete []name;
    return 0;
}

char* getname()
{
    char temp[100];//temporary storage
    cout<<"Enter name:";
    cin>>temp;
    char* pn=new char[strlen(temp)+1];
    strcpy(pn,temp);//copy string into smaller space
    return pn;
}

注意该程序中将new和delete分开放在不同的函数中,此行为不推荐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值