动态申请和释放内存

本文详细介绍了如何在C++中使用new和delete操作符进行一维及二维动态数组的分配与释放,包括初始化过程,提供了具体的代码示例,并指出了常见的错误实践。

1.一维数组内存的动态分配和释放如下:

int *array=new int [10];   //动态分配(例如分配10个单元的) 
memset(array,0,sizeof(array));     //初始化  (也可以利用一个for循环对其赋值初始化)
delete [] array;           //撤销

2.二维数组m行n列)利用new来进行动态分配实际上相当于对m个n元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来这项操作。

具体做法如下:

int **array;
array=new int *[10];
for(int i=0;i<10;i++)
{
	array[i]=new int [5];
}

   上面的操作完成了一个10行5列的二维数组array[10][5]的动态分配,可以看到我们先动态分配了一个10单元的数组的指针的指针的首地址给array,然后再对其每个首地址进行遍历,同时完成一个5单元的数组的动态分分配,并把首地址给array[i],从而最终完成了二维数组array[10][5]的动态分配。

3.二维数组的初始化

   MSDN对memset的描述如下:

memset

Sets buffers to a specified character.

void *memset( void *dest, int c, size_t count );

可见memset只能作用于一个一维数组void *dest,因此最好的办法就是和二维数组的动态分配结合起来,new一个,memset一个。具体写法如下:

int **array;
array=new int *[10];
for(int i=0;i<10;i++)
{
	array[i]=new int [5];
	memset(array[i],0,5*sizeof(int));
}

 

4.二维数组内存的释放

 

for (int i = 0; i < 10; i++)
{
	delete[5]array[i];
}
delete[]array;

 

5.完整的例子

int x = 3, y = 4;
int **p = new int*[x];//创建一个动态 int* 型数组
for (int i = 0; i < y; ++i)
p[i] = new int [x]; //再创建一个动态 int 型数组
for (int i = 0; i < y; ++i)
{
	delete [] p[i];//由里至外,进行释放内存。
	p[i] = NULL;//不要忘记,释放空间后p[i]不会自动指向NULL值,还将守在原处,只是释 放内存而已,仅此而已。
}
delete []p;
p = NULL;


6.一些错误的例子

int (*p)[4] = new int[3][4];    //错误!
int *p = new int[4][2];         //错误!

int x = 3, y = 4;
int (*p)[y] = new int[x][y];
//错误,y必须是const。所以这种方式不能达到真正的动态分配二维数组的目的,只能相当于半自动化的一个分配方式。


 


 

 


 

 



 

 

### 原理 对于非内部类对象,普通的`malloc/free`不能满足动态对象需求。对象创建时需自动执行构造函数,消亡前要自动执行析构函数,而`malloc/free`是库函数,不在编译器控制权限内,无法完成构造析构任务[^1]。 在Linux内核中,`kmalloc`从低端内存区域分配,该区域开机就一次性映射好,申请时不需要做映射,且在物理内存上是连续的,`phys_to_virt/virt_to_phys`只是简单的内存线性偏移[^2]。 ### 方法 - **C语言**:使用`malloc`、`calloc`、`realloc`进行内存动态申请,使用`free`释放内存。 - `malloc`:分配指定大小的内存块。 - `calloc`:分配指定数量大小的内存块,并初始化为0。 - `realloc`:调整已分配内存块的大小。 - `free`:释放之前分配的内存块。 - **C++语言**:使用`new`运算符进行内存动态申请,使用`delete`运算符释放内存;对于数组,使用`new[]``delete[]`。 - **Linux内核**:使用`kmalloc`进行内存动态申请,使用`kfree`释放内存。 ### 示例 #### C语言示例 ```c #include <stdio.h> #include <stdlib.h> int main() { // 使用malloc申请内存 int *ptr = (int *)malloc(5 * sizeof(int)); if (ptr == NULL) { printf("内存分配失败\n"); return 1; } // 使用内存 for (int i = 0; i < 5; i++) { ptr[i] = i; } // 输出内存中的值 for (int i = 0; i < 5; i++) { printf("%d ", ptr[i]); } printf("\n"); // 释放内存 free(ptr); return 0; } ``` #### C++语言示例 ```cpp #include <iostream> class MyClass { public: MyClass() { std::cout << "构造函数被调用" << std::endl; } ~MyClass() { std::cout << "析构函数被调用" << std::endl; } }; int main() { // 使用new申请对象 MyClass *obj = new MyClass(); // 释放对象 delete obj; return 0; } ``` #### Linux内核示例 ```c #include <linux/init.h> #include <linux/module.h> #include <linux/slab.h> static int __init my_module_init(void) { // 使用kmalloc申请内存 char *ptr = kmalloc(100, GFP_KERNEL); if (ptr == NULL) { printk(KERN_ERR "内存分配失败\n"); return -ENOMEM; } // 使用内存 sprintf(ptr, "Hello, Kernel!"); printk(KERN_INFO "分配的内存内容: %s\n", ptr); // 释放内存 kfree(ptr); return 0; } static void __exit my_module_exit(void) { printk(KERN_INFO "模块退出\n"); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值