1、C malloc 和 free vs C++ new 和delete:
C 语言的malloc() 和free() 并不会调用析构函数和构造函数。C++的 new 和 delete 操作符 是 "类意识" ,并且当调用new的时候会调用类的构造函数和当delete 调用的时候会调用析构函数。
下面一个例子
运行结果:
如图一
注意:混合用malloc 和delete或者混合用new 和free 是不正确的。C++的new和delete是C++用构造器分配内存,用析构函数清除使用过的内存。
new/delete 优点:
-
new/delete调用 constructor/destructor.Malloc/free 不会.
-
new 不需要类型强制转换。.Malloc 要对放回的指针强制类型转换.
-
new/delete操作符可以被重载, malloc/free 不会
-
new 并不会强制要求你计算所需要的内存 ( 不像malloc)
2、C 的动态内存分配:
看如下例子MallocTest.cpp
结果:
图二
注意:
-
-
-
realloc: realloc是给一个已经分配了地址的指针重新分配空间
-
3、C++ 动态内存分配:
使用 "new" 和 "delete"
如下示例:文件: AllocNewTest.cpp
注意:
结果如图:
图四
4、C 函数返回一个指针vs C++函数返回的是一个副本:
C 函数返回一个指针
运行结果:
图五
C++ 函数返回的是一个副本:
运行结果
图六
注意:c++的STL string类的赋值构造函数是被用来返回一个值的副本,也就是当我们离开了函数的时候,变量 "ost",不在作用域了,但是所赋复制的内容是有效的。不要返回"return ost.str().c_str()" 作为他的指针,他是不在作用域的内一旦程序离开了函数,并且数据会丢失。
5、C++ 动态内存分配的异常处理:
运行:
6、C++ Virtual Destructors
运行结果:
图七
注意:
- 如果删除操作符被应用在基类中,并且其析构函数并不是虚函数,这将会引起内存泄露,因为只有基类的内存被释放掉。
- 基类的析构函数不是纯虚函数,将不能被作为基类而实现。
- 类的析构函数可以不是virtual
分享到:
相关推荐
操作系统 动态 内存分配与回收 ,包含各种分配算法 c/c++
详细讲解C++内存分配的问题及C++与C分配内存的方式的不同,同时介绍在C++中分配内存的最佳方式。
C和C++动态内存分配如堆,栈,数据段
通过例子解析指针引用及动态内存分配觉得有用看好再下
一、C/C++程序的内存分配 一个C/C++程序占用的内存区一般可以分为如下五种: ①全局/静态数据区 ②常量数据区 ③代码区 ④堆 ⑤栈 显然代码存放在代码区,而程序的数据则根据数据种类的不同放在...
根据生命周期结束后可以自动释放内存.严格来说是可以说半自动回收,个人原编,希望对大家有用,反正我是用的挺爽,创建内存方面,内存回收也干净.
C/C++内存分配方式,堆区,栈区专题.rar
C/C++ 开发必备 高质量C/C++编程 规范编程风格,内存分配,指针
用C语言实现动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,分别采用首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法进行内存块的分配和回收,同时显示内存块分配和...
C和C++语言的内存分配详解
C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...
#include <stdlib.h> //定义杂项函数及内存分配函数 #include <string.h> //字符串处理 #include <strstrea.h> //基于数组的输入/输出 #include <time.h> //定义关于时间的函数 #include <wchar.h> //宽字符...
深入详解c与c++内存分配问题,堆和栈的区别,以及指针的使用等。
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针...
C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象。
现在我们将讨论C/C++里我认为哪一本书都没有完全说清楚,也是涉及概念细节最多,语言中最难的技术之一的动态内存的传递。并且在软件开发中很多专业人员并不能写出相关的合格的代码。【引入】 看下面的例子,这是我们...
面试题18:简述C、C++程序编译的内存分配情况 面试题19:以下四段代码中哪段没有错误 第6章 字符串 6.1 数字字符串 面试题1:编码实现数字转化为字符串 面试题2:编码实现字符串转化为数字 6.2 字符串函数 面试题3:...
#include #include #include #include main() { char *p; char *q; p=(char*)malloc(25*sizeof(char)); if(p==NULL) exit(1); //q=(char*)malloc(10*sizeof(char)); //if(q==NULL) exit(1);... printf
这篇资料详细分析了如何在嵌入式系统中编写安全,健壮的 c/c++代码
本文首先总结了C和C++中动态内存分配函数的使用要点,然后总结并分析了 C+ + 中常见的内存错误,提出了一些解决对策和预防措施 ,最后通过加入检测区域、重载new操作符来完成C++程序中部分内存越界问题的检测。