malloc函数
原型:extern void *malloc(unsigned int num_bytes);
用法:#include <malloc.h>
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
举例:
// malloc.c
#include <syslib.h>//此处在VC6.0上调试有问题,最好改成#include <stdio.h>
#include <malloc.h>
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
函数声明(函数原型):
void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:
int *p;
p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;
而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。
第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:
int* p = (int *) malloc (1);
代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。
malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。
比如想分配100个int类型的空间:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。
另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
对其做一个特例补充
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
此时得到的是Got a valid pointer。把0赋给maclloc能得到一个合法的指针。
struct hostent *hp;
//注意是sizeof( sturct hostent )而不是sizeof( sturct hostent* )
//其中N代表你需要的sturct hostent类型数据的数量
hp = ( struct hostent* ) malloc ( N * sizeof( sturct hostent ) );
if ( !hp ) //建议要加上这个内存分配成功与否的检测
{
// 添加内存分配失败时的处理方法
}
new delete, free malloc
首先应该知道malloc 和free是匹配的;new和delete是匹配的,他们不可以混淆。
malloc和new都申请空间,但是new是强类型的分配,会调用对象的构造函数初始化对象,而malloc仅分配内存空间但是不初始化。
new 自适应类型,malloc需要强制转换new按类型进行分配,malloc需要指定内存大小对于对象来说free的确释放了对象的内存,但是不调用对象的析构函数。delete不仅释放对象的内存,并且调用对象的析构函数所以在对象中用free删除new创建的对象,内存就有可能泄露在delete内部仍调用了free .
补充一点:new和malloc虽然都是申请内存,但申请的位置不同,new的内存从free store分配,而malloc的内存从heap分配(详情请看ISO14882的内存管理部分),free store和heap很相似,都是动态内存,但是位置不同,这就是为什么new出来的内存不能通过free来释放的原因。不过微软编译器并没有很好的执行标准,很有可能把free store和heap混淆了,因此,free有时也可以。
再补充一点:delete时候不需要检查NULL
delete NULL; 是没有任何问题的,所以
if(p)
{
delete p;
p = NULL;
}
还不如
delete p;
p = NULL;
而free(NULL)那就麻烦大了。
分享到:
相关推荐
如果项目中使用了OpenCV,那么可以实现更复杂的图像处理操作,比如边缘检测、特征匹配等。 5. **性能比较**:项目中可能会对比Java和NDK处理同一图片的速度和内存消耗,展示NDK的优势。这通常需要使用Android的...
在Android开发中,为了优化性能和减少内存消耗,开发者可能会选择使用NDK(Native Development Kit)来处理资源,比如加载GIF动图。本话题主要探讨如何利用NDK加载GIF文件,以提高加载速度并避免Java层可能出现的Out...
在Android开发中,NDK(Native Development Kit)是一个重要的组件,它允许开发者使用C和C++原生代码来编写部分应用程序,从而实现高性能计算和低级硬件交互。本篇文章将聚焦于Android NDK在数据传输方面的应用,...
对于内存分配,推荐使用标准的`malloc()`/`free()`函数或利用DSP/BIOS进行内存管理。 - **使用标准库函数**:适用于简单场景。 - **使用DSP/BIOS**:更适合复杂应用场景,提供更高级别的内存管理和错误处理机制。 ...
标签中提到的"NDK"可能指的是Android Native Development Kit,这是一个允许开发者用C和C++编写原生代码的工具集。在Android开发中,有时需要利用C语言标准库来实现高性能或低级的操作,例如游戏引擎、图形处理或...
6. **内存管理**:如果游戏涉及动态内存分配,那么会使用`malloc`和`free`来创建和释放内存。 通过阅读、理解和修改这个源码,C语言初学者可以提升他们的编程技能,同时也能了解游戏开发的基本流程和技巧。对于更...
7. **移植性**:虽然C语言编写的程序通常具有很好的跨平台性,但此项目还涉及Android标签,这意味着可能需要将C代码与Android Native Development Kit (NDK)结合,使用JNI(Java Native Interface)来实现Android...
这个指南将深入探讨如何在Android应用开发中使用JNI,以便利用原生库的优势,提高性能或调用特定硬件功能。 一、JNI基础 1. JNI简介:JNI是一种接口,允许Java代码与其他语言编写的代码进行交互。在Android中,JNI...
由于Lame是C语言编写的,所以需要通过NDK来调用。在Android Studio中,打开`build.gradle(Module)`文件,添加NDK支持并引入Lame源码。在`defaultConfig`块中增加如下配置: ```groovy externalNativeBuild { ndk {...
9. **内存管理**:C/C++代码需要手动管理内存,使用`malloc`和`free`分配和释放内存。同时,需要注意Java对象的生命周期,以避免内存泄漏。 10. **多线程支持**:如果本地方法在多个线程中运行,需要处理线程同步...
这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...
2. **注册本地方法**:在Java类中声明native方法,并在对应的C/C++代码中使用`JNI_OnLoad`函数注册这些方法。 3. **字符串在JNI中的表示**:Java中的字符串在JNI中表现为`jstring`类型,可以使用`env->...
开发者可以使用NDK将C/C++代码编译为.so动态链接库,并通过Gradle插件集成到Android项目中。 在文件名称为"JNI03"的资源中,可能是系列教程的一部分,可能包含具体的示例代码、解释和步骤,指导读者如何实现特定的...
为正常函数malloc的封装使用的时候与malloc无特殊差别,唯一差别就是会将申请的内存 注册到plist链表中, 最后函数退出的时候统一调用 cgfree 与free函数类似不使用参数 调用cgfree后会将注册的所有内存全部释放,...
首先,"HelloAndroidJni"是一个典型的Android项目,用于演示如何在Android应用中使用JNI技术。项目中通常包含以下几个部分: 1. **Java源代码**:在项目的`src/main/java`目录下,你会看到一个Java类,例如`...
在C/C++代码中定义函数,然后在Java类中通过`native`关键字声明对应的函数,并使用`javah`工具生成JNI头文件。 4. **加载库文件**:在Android应用中,使用`System.loadLibrary("ffmpeg")`加载.so库。确保库文件已...
2. **环境配置**:学习如何设置Android Studio项目,添加NDK支持,配置JNI路径,以及如何在Android.mk或CMakeLists.txt文件中编写构建规则,确保本地库能正确编译和链接。 3. **JNI函数声明**:讲解如何在Java类中...
安装NDK后,你可以在Android项目中使用本地代码来实现高性能计算或者利用已有的C/C++库。 1. **创建JNI加载类**: 在Java代码中,你需要定义一个类,并使用`native`关键字标记你想要在C++/C中实现的方法。例如,...
JNI中需要手动管理内存,使用`malloc`和`free`分配和释放内存,避免内存泄漏。同时,注意Java对象和本地对象的生命周期管理,避免引用悬挂。 8. **异常处理**: JNI提供了`ExceptionOccurred`和`...