动态对象创建

  • 1、和malloc calloc realloc比较
  • 2、new 给基本类型申请空间
  • 3、new 申请 基本类型数组空间(案例)
    • 注意:
  • 4、new delete 给类对象申请空间
  • 对象数组
    • 本质是数组 只是数组的每个元素是类的对象
    • 如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。
    • 用new delete申请 对象数组
    • 尽量不要用delete释放void *
      • 注意:没有析构?为什么?
    • 注意:malloc、free和new、delete 不可以混搭使用

努力的意义,不是让你取得多大的成就,而是让你在平凡的日子里,活得比原来的那个自己更好一点。

1、和malloc calloc realloc比较

当我们创建数组的时候,总是需要提前预定数组的长度,然后编译器分配预定长度 的数组空间,在使用数组的时,会有这样的问题,数组也许空间太大了,浪费空 间,也许空间不足,所以对于数组来讲,如果能根据需要来分配空间大小再好不 过。 所以动态的意思意味着不确定性。 为了解决这个普遍的编程问题,在运行中 可以创建和销毁对象是最基本的要求。当然c早就提供了动态内存分配(dynamic memoryallocation),函数malloc和free可以在运行时从堆中分配存储单元。 然 而这些函数在c++中不能很好的运行,因为它不能帮我们完成对象的初始化工作。
1.1、malloc返回一个void指针,c++不允许将void赋值给其他任何指针,必须强转。
1.2、malloc可能申请内存失败,所以必须判断返回值来确保内存分配成功。
1.3、malloc 不会调用构造函数。free 不会调用析构函数(重要的)

当创建一个c++对象时会发生两件事:

  1. 为对象分配内存
  2. 调用构造函数来初始化那块内存 第一步我们能保证实现,需要我们确保第二 步一定能发生。c++强迫我们这么做是因为使用未初始化的对象是程序出错的 一个重要原因。4.3.9.2C动态分配内存方法 为了在运行时动态分配内存,c 在他的标准库中提供了一些函数,malloc以及它的变种calloc和realloc,释放内 存的free,这些函数是有效的、但是原始的,需要程序员理解和小心使用。为 了使用c的动态内存分配函数在堆上创建一个类的实例,我们必须这样做:
lass Person
{
public: Person(){ mAge = 20; pName = (char*)malloc(strlen("john")+1); strcpy(pName, "john"); } void Init(){ mAge = 20;pName = (char*)malloc(strlen("john")+1); strcpy(pName, "john"); } void Clean(){ if (pName != NULL){ free(pName);}}
public: int mAge; char* pName;
};
int main()
{//分 配 内 存 Person* person = (Person*)malloc(sizeof(Person)); if(person == NULL){ return 0; }// 调 用 初 始 化 函 数 person->Init(); // 清 理 对 象 person->Clean(); // 释 放 person 对 象 free(person);return EXIT_SUCCESS;
}

问题:
1)程序员必须确定对象的长度。
2)malloc返回一个void指 针 , c++ 不允许将 void 赋值给其他任何指针,必须强转。
3)malloc可能申请内存失败,所以必须判 断返回值来确保内存分配成功。
4)用户在使用对象之前必须记住对他初始化,构 造函数不能显示调用初始化(构造函数是由编译器调用),用户有可能忘记调用初始 化函数。
c 的动态内存分配函数太复杂,容易令人混淆,是不可接受的,c++中我们推荐使用 运算符new和delete。

2、new 给基本类型申请空间

C ++中解决动态内存分配的方案是把创建一个对象所需要的操作都结合在一个称为new的运算符里。当用new创建一个对象时,它就在堆里为对象分配内存并调用构 造函数完成初始化。

Person* person = new Person;
相当于:
Person* person = (Person*)malloc(sizeof(Person)); if(person == NULL){ return 0; }
person->Init(); //构造函数

New操作符能确定在调用构造函数初始化之前内存分配是成功的,所有不用显式 确定调用是否成功。 现在我们发现在堆里创建对象的过程变得简单了,只需要一个简单的表达式,它带有内置的长度计算、类型转换和安全检查。这样在堆创建一 个对象和在栈里创建对象一样简单。

void test01()
{//基本类型int *p = NULL;//p = (int *)calloc(1,sizeof(int));//p = new int(100);// *p = 100p = new int;*p = 100;cout<<"*p = "<<*p<<endl;//100//释放 free(p)delete p;
}

3、new 申请 基本类型数组空间(案例)


注意:

new 没有加[] delete释放的时候 就不加[]
new 加[] delete释放的时候 就加[]

4、new delete 给类对象申请空间

无参
void test04()
{data *p = new data;delete p;
}


有参

void test05()
{data *p = new data{"lucy",18};p->showdata();delete p;
}

对象数组

本质是数组 只是数组的每个元素是类的对象

void test06()
{//对象数组 ob是数组每个元素是data类型的对象//定义对象数组的时候 系统会自动给 数组中的每个元素 调用构造函数//调用无参构造函数data ob[5];
}

运行结果:

如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。

void test07()
{//对象数组 arr1是数组 每个元素是Person类型的对象//定义对象数组的时候 系统会自动给 数组中的每个元素 调用构造函数//人为 为元素 调用有参构造//初始化部分 调用有参构造 为初始化部分自动调用默认构造(无参构造)data arr1[5]={ data("lucy",18), data("bob",20)};//arr1[0] 第0个元素 就是Person的对象arr1[0].showdata();arr1[1].showdata();
}

运行结果:

用new delete申请 对象数组

尽量不要用delete释放void *

注意:没有析构?为什么?

delete发现p1指向的类型 为void 无法从void中寻找响应析构函数

注意:malloc、free和new、delete 不可以混搭使用

C++ 从堆区申请空间 new和delete相关推荐

  1. 嵌入式c语言如何在堆区开辟空间

    堆区是动态内存分配的一个重要区域,在C语言中可以使用malloc()函数在堆区开辟空间.malloc()函数的语法如下: void *malloc(size_t size); 其中,size是您需要开 ...

  2. 一个进程能用的最大内存(堆区)空间大小为1G

    网上看到的分析: 32位意味着4G的寻址空间,linux把它分为两部分:最高的1G(虚拟地址从0xC0000000到0xffffffff)用做内核本身,成为"系统空间",而较低的3 ...

  3. C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free

    内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函数时,函数内局 ...

  4. C++在堆区创建数组

    new申请数据空间 c++中的new在堆区申请空间的时候的格式是: int * p = new int(10); //该代码的意思就是说在堆区申请的内存赋值为10 //int 后面括号里面写的就是你的 ...

  5. fork练习、从进程角度考虑堆区内存申请与释放的有关问题

    1.fork练习 1.1代码1; int main( int argc, char* argv[], char* envp[]) {int i = 0;for( ; i < 2; i++ ){f ...

  6. c++中在堆和栈中申请空间的差别

    堆中和栈中申请的空间的比较, 我找到了下面的比较: 栈的情况: 栈上分配空间的好处是快,而且对象生存期是自动的,离开当前域之后就自动析构回收. 坏处就是栈空间有限,而且不能人为控制对象的生存期, 比如 ...

  7. stack vs heap:栈区分配内存快还是堆区分配内存快 ?

    作者 | 码农的荒岛求生 来源 | 码农的荒岛求生 有伙伴问到底是从栈上分配内存快还是从堆上分配内存快,这是个比较基础的问题,今天就来聊一聊. 栈区的内存申请与释放 毫无疑问,显然从栈上分配内存更快, ...

  8. Linux申请空间(malloc)

    1.进程在执行的过程中,malloc申请空间,不使用时,没有free就会出现内存泄漏; 如果进程结束了,那么所有向操作系统申请的内存都会被回放(释放); 2.申请1G或者更大空间,到底能不能成功? 如 ...

  9. C/C++堆区、栈区、常量区、静态数据区、代码区详解

    转自:http://blog.csdn.net/hackerain/article/details/7953261 http://blog.csdn.net/firefly_2002/article/ ...

最新文章

  1. 《C#精彩实例教程》小组阅读06 -- C#运算符与表达式
  2. python装饰器-理解Python装饰器(Decorator)
  3. return 和 方法的递归调用
  4. oracle中col 的用法,Oracle All
  5. DotNetNuke出错:“Runat 属性必须具有值 Server(The Runat attribute must have the value Server Error)...
  6. 切片slice(python)
  7. javascript各种事件
  8. python threading_Python threading的使用方法解析
  9. 如何在JavaWeb程序中使用tld文件
  10. 基于微博数据的人物性格分类系统
  11. [深度学习][转载]人脸识别相似度计算方法
  12. 杰理之出现一拖二通话下第二台手机通话近端听不见远端说话【篇】
  13. amend和rebase
  14. 程序人生-我已经努力了七年!!!
  15. nginx报错问题记录
  16. 年月日、年积日、简化儒略日、GPS周之间相互转换(C++)
  17. 小程序里显示店铺地址,可在地图上查看,可点击导航到店铺
  18. 数据分析师必备思维——矩阵思维
  19. ASCII码对照表(C++17 实现ANSI、UTF8、Unicode字符编码互转)
  20. 计算机视觉算法岗 面试经验 (转载)

热门文章

  1. clang static analyzer总结
  2. 发现21cn邮箱存在严重的安全漏洞及风险,对于申请密保的邮箱可以随便更改任意用户的密码...
  3. 软件测试工程师的介绍
  4. 计算机与汉字+输入速度+云输入法,计算机与中文输入法-西安交通大学教师个人主页.PDF...
  5. python什么是类和对象_python的类和对象(1)
  6. 【蓝桥杯选拔赛真题27】python输出最后字符 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
  7. 下载GHOST重新安装系统,四个硬盘分区变成一个,如何恢复其他硬盘中的资料
  8. 关于S50卡密钥A和密钥B
  9. 计算机技术考长沙理工大学难不难,长沙理工大学难考吗?长沙理工大学值得上吗?...
  10. 蜂巢输入法android,讯飞输入法首创云+端“蜂巢”输入模型