unit07动态讲义分配内存空间
- 格式:ppt
- 大小:940.00 KB
- 文档页数:119
动态内存分配【学习要点】1.掌握C++的四个内存区域。
2.掌握堆内存和动态存储分配。
3.掌握new 与delete 运算符的使用。
4.掌握动态创建对象。
5.掌握对象的浅拷贝、浅赋值。
6.掌握对象的深拷贝、深赋值。
------------------------------------------------------------------------------------------------------------------------------------------------【例题分析】1.为指针变量p赋初值,下列语句中不正确的是______。
A.int *p = 0;B.float *p = ( float* )50;C.int *p = new 50;D.float *p = new float[ 50 ];【答案】C【解析】答案A给指针p 赋0值(空指针)是正确的;答案B将整数50的单元类型强制转换为实型指针也是可以的;答案D将指针p 指向在堆区上申请的具有50个元素的实型数组也是可以的;答案C错误,因为new 运算符的运算对象不能是常数。
2.编写程序:有数组a,其中存放20个数据为:{ 1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 9, 10, 10 },已按升序排列。
试定义一个类ARRAY,实现将数组中相同的元素删除成只剩一个,即删除重复的数据。
删除重复的数据后,数组a中的内容为:{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }。
要求:①私有成员数据:●int *a;//存放数据的动态数组容器的起始地址●int n;//动态数组容器中已存放数据的个数②公有成员函数:●ARRAY ( int x[ ] , int size );//用数组x[size] 来初始化ARRAY类的对象●~ARRAY ( );//析构函数●void deleteSame ( );//将数组中重复的元素删除成只剩一个●void show ( );//按每行4个数据的格式输出③编写main()函数对ARRAY类进行测试。
C语⾔中关于动态内存分配的详解⽬录⼀、malloc 与free函数⼆、calloc三、realloc四、常见的动态内存的错误【C语⾔】动态内存分配本期,我们将讲解malloc、calloc、realloc以及free函数。
这是个动态内存分配函数的头⽂件都是 <stdlib.h>。
c语⾔中动态分配内存的函数,可能有些初学c语⾔的⼈不免要问了:我们为什么要通过函数来实现动态分配内存呢?⾸先让我们熟悉⼀下计算机的内存吧!在计算机的系统中⼤致有这四个内存区域:1)栈:在栈⾥⾯储存⼀些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存⼀些字符常量,⽐如:char *p=”hello world”;其中”hello world”就储存在字符常量区⾥⾯;3)全局区:在全局区⾥储存⼀些全局变量和静态变量;堆:堆主要是通过动态分配的储存空间,也就是我们接下需要讲的动态分配内存空间。
静态内存和动态内存的⽐较:静态内存是有系统⾃动分配,由系统⾃动释放。
静态内存是在栈分配的。
(例如:函数⾥的局部变量)动态内存是由程序员⼿动分配,⼿动释放。
动态内存是在堆分配的。
(例如:⽤C语⾔写链表时,需要⾃⼰对Node结点分配内存空间)⼀、malloc 与free函数void* **malloc( size_t ** size);返回类型: void*,也就是说这个函数的可以返回所有类型的指针形式。
只需要在开辟空间的时候进⾏强制类型转换⼀下即可。
函数参数:size_t size, 这个参数就是告诉这个函数,你需要开辟多少个字节的内存空间。
void free(void* memblock) ;没有返回参数。
函数参数:void* memblock, free函数可以接收来⾃所有类型指针的动态分配的内存空间。
⼀切以栗⼦来描述吧:#include <stdlib.h>#include <stdio.h>int main(){//开辟10个int类型的空间int* arr = (int*)malloc(10 * sizeof(int)); //切记这⾥给的⼤⼩,是10 * int(4个字节)int i = 0;if (arr == NULL){perror("malloc"); //有可能,malloc开辟空间失败,则malloc会返回NULLreturn 1;}for (i = 0; i < 10; i++)*(arr + i) = i; //放⼊数据 0 (9)for (i = 0; i < 10; i++)printf("%d ",*(arr + i));//记得释放所开辟的空间free(arr);return 0;}⼆、callocvoid* calloc (size_t num, size_t** size );返回类型:与malloc函数是⼀样的,就不在多说了。
第7章类和动态内存分配提要•本章介绍对类使用动态分配技术,以及由此引起的问题的处理。
•动态内存的使用将影响构造函数,析构函数的设计和操作符的重载7.1 动态内存和类•一个使用动态内存的例子class StringBad{private:char * str; // pointer to stringint len; // length of stringstatic int num_strings; // number of objectspublic:StringBad(const char * s); // constructorStringBad(); // default constructor~StringBad(); // destructor// friend functionfriend std::ostream & operator<<(std::ostream & os, const StringBad & st);};•以下是其实现(stringbad.cpp)•静态类成员的初始化int StringBad::num_strings = 0;///注意:–静态类成员位于静态存储区,并不是类对象的组成部分;–在类声明中声明,不可初始化(静态const整型或枚举除外除外);–在类方法实现文件中初始化。
使用类型名和定义域限制操作符,不用关键字static。
•然后是构造函数StringBad::StringBad(const char * s){len = std::strlen(s); // set sizestr = new char[len + 1]; // allot storagestd::strcpy(str, s); // initialize pointernum_strings++; // set object countcout << num_strings << ": \"" << str<< "\" object created\n"; // For Your Information }注意:字符串并没有保存在对象中,而是在单独的堆内存中。
C语言中的动态内存分配和释放方法动态内存分配是C语言中非常重要的概念之一。
它使得程序可以在运行时动态地申请和释放内存空间,这样可以使程序更加灵活、高效。
本文将介绍C语言中的动态内存分配方法以及相应的内存释放方法,以帮助读者更好地理解和运用这一概念。
1. 动态内存分配的函数 - malloc()在C语言中,可以使用malloc()函数来动态地分配内存空间。
该函数的原型如下所示:```cvoid* malloc(size_t size);```该函数接受一个size_t类型的参数size,表示所需分配的内存空间大小(以字节为单位),并返回一个void*类型的指针,指向所分配的内存空间的起始地址。
使用malloc()函数时,需要注意以下几点:- 需要在使用前包含stdlib.h头文件。
- 分配的内存空间大小应该足够满足程序的需求,否则可能导致内存溢出或者浪费。
- 如果malloc()函数无法分配所需大小的内存空间,它将返回NULL指针。
下面是一个使用malloc()函数动态分配内存空间的示例:```cint* p = malloc(sizeof(int));if (p != NULL) {*p = 10;printf("%d\n", *p);}```在这个示例中,我们使用malloc()函数分配了一个int类型大小的内存空间,并将其指针赋值给指针变量p。
然后,我们通过*p来访问和修改这个内存空间中存储的值。
2. 动态内存释放的函数 - free()在完成动态内存分配后,为了避免资源的浪费和内存泄漏,需要使用free()函数来释放已经分配的内存空间。
该函数的原型如下所示:```cvoid free(void* ptr);```该函数接受一个void*类型的指针ptr,指向待释放的内存空间。
调用free()函数后,该内存空间将被释放,并可供其他程序使用。
需要注意以下几点:- 需要在使用前包含stdlib.h头文件。