关于内存的动态分配

2024-06-16 22:48
文章标签 内存 动态分配

本文主要是介绍关于内存的动态分配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在C语言中,内存的动态分配是使用malloc和free来开辟和释放内存资源,而在C++中,出了可以利用和C语言中同样的malloc和free之外,还可以使用new和delete关键字来开辟和释放内存。需要注意的是,malloc和free,new和delete需要配对使用。

malloc是一个函数,原型为extern void *malloc(unsigned int num_bytes); 例如 int*p=malloc(sizeof(int));

malloc和new的区别

 1 性质不同,malloc是一个函数 而new是一个运算符。

 2 参数不同,malloc的参数是内存的大小,是一个无符号的整数。而new的参数是数据类型。

 3 返回值类型不同,malloc返回的是一个无类型的指针(void *),可以强制转换。而new返回的指针类型以确定。

 4 malloc不会调用构造函数,new会调用构造函数。

 5 malloc不会抛出异常,而new会抛出异常。

 6 当调用出错时,malloc会返回空值(NULL),不可更改。而new可以重置是否抛出异常。

 7 malloc()开辟的空间只能用free()来释放,new开辟的空间只能用delete来释放,在delete时,会调用析构函数。

下面是从百度知道和论坛贴过来的一些和这有关的内容,可以参考下。

   1.malloc是一个函数,原型为extern void *malloc(unsigned int num_bytes); 参数为需要开辟的内存的大小,是一个无符号的整型变量,返回值为一个类型为空指针。

       new是一个运算符,new会在堆上分配一块内存,并自动调用类的构造函数。可以对内存进行初始化,返回的指针带有类型信息。

malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可
用于申请动态内存和释放内存。 
对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象
在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于
malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数
和析构函数的任务强加于 malloc/free。 因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个
能完成清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数
C++编程语言中有一种叫做new的术语。不过这一概念是比较模糊的,有些人把它理解为new函数,但是有的人又会把它理解为new运算符。那么它的真正含义又是如何的呢?在这里我们将会通过对C++ new用法的介绍,帮助大家一起分析一下。 C++ new用法之一 new运算符 最常用的是作为运算符的new,比如: string *str = new string(“test new”);
作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。 new会在堆上分配一块内存,并会自动调用类的构造函数。 C++ new用法之二 new函数
第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是: void *operator new(size_t size);
new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。 如果使用new函数,和语句string *str = new string(“test new”)相对的代码大概是如下的样子
1. string *str = (string*)operator new(sizeof(string));   2.                 
3. str.string(“test new”);    4.                 
5. // 当然这个调用时非法的,但是编译器是没有这个限制的   这还不算完,还有第三种的new存在。


这篇关于关于内存的动态分配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067768

相关文章

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存