1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式

1. 有些时候在运行时创建数组由于在编译时创建数组(有些时候不是这样, 比如使用OpenGL绘图和GPU并行计算结合的时候, 需要将大量的数据传送到显存, 每次计算完又要传送回宿主机渲染, 但并不是要传送回所以值, 有些值可以仍然留在显存中, 对于这些值, 显然一次创建最恰当, 使用静态数组最合适, 当然使用动态数组也可以, 但是只需创建一次就可以了), 对于结构体也是这样.

2. C++中的结构体. 有两种方式, 一种是动态方式, 一种是静态方式. 使用new一般是动态方式, 一般是与指针搭配, 静态方式是直接声明的.
    struct price{
         int apple;
         int orange;
     };
     静态方式, 是结构体类型数据, 类似于int类型数据的声明方式, 如price p1={100,200};或者price p1; p1.apple=100; p1.orange=200; 静态方式是结构体类型数据, 访问结构体成员的时候采用句点操作符, 例如p1.apple, p1.orange.
     动态方式, 结构体指针类型数据, 采用箭头操作符访问结构体成员, 如price * p2=new price; p2->apple=100; p2->orange=200; 当然也可以通过这样的方式采用句点操作符访问结构体成员. 例如对于结构体指针price *p3=new price;(这里创建了一个结构体, 将结构体的首地址返回给等号右边, 并赋给指向此结构体的指针p3, 不能直接写成price *p3, 这样只是创建了一个指针, 并没有创建结构体), p3是指向结构体的指针, 那么使用解除引言操作符*可以得到结构体本身, 即*p3是结构体本身, 那么访问成员的方式可以这样(*p3).apple, (*p3).orange.

3. 使用new动态分配内存, 并释放内存一遍重新使用. 下面的代码使用了返回指针的函数.

4. 三种存储方式: 自动存储, 静态存储, 动态存储.
   自动存储: 函数内部定义的常规变量使用自动存储空间, 称为自动变量(也称局部变量), 如getname函数中的temp, pn. 他们在所属的函数被调用时自动产生, 在该函数结束时消亡, 例如getname函数中的temp只在getname函数被调用时存在, 当调用结束时, temp使用的内存将被自动释放, 如果getname返回temp的地址, 则main函数name指向的内存将很快被重新使用, 因此我们必须在getname中使用new并获取一个副本.
   静态存储: 静态存储是在整个程序执行期间都存在的存储方式, 在函数外声明它或者使用关键字static.
   动态存储: new和delete提供了比自动变量和静态变量更灵活的方法. 他们管理一个内存池, 也成为自由存储空间. 内存池通用语静态变量和自动变量的内存是分开的. new和delete是程序员对程序如何使用内存有更大的控制权.

5. 堆栈, 堆和内存泄漏. 如果使用了new, 没有调用delete, 即使包含指针的内存由于作用域规则和对象生命周期的原因而被释放, 但是在自由存储空间上动态分配的变量或者结构也将继续存在, 但是将会无法访问这些内存, 因为指向这些内存的指针无效了.这将导致内存泄漏. 被泄漏的内存将在程序的整个生命周期内斗不可使用, 这些内存被分配出去, 但无法收回, 可能导致可用内存耗尽, 程序崩溃. 我们要养成一种好习惯, 成对的使用new和delete, 在自由存储空间上动态分配内存, 随后便释放它.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值