C++动态内存

C++程序中内存分为两个部分

栈:在函数内部声明的所有变量都将占用栈内存。

堆:这是程序中未使用的内存,在程序中可用于动态分配内存。

在很多时候,我们无法提前预知需要多少内存来存储某个变量的特定信息,所需内存的大小需要在运行时才能确定。

在C++中,可以使用特殊的运算符为给定类型的变量在运行时分配堆的内存,这会返回所分配的地址空间。这种运算符即new运算符。如果不需要动态分配的内存空间,可以使用delete运算符,删除之前new分配符分配的内存。

 

delete和delete[]区别

  1. 针对简单类型使用new分配后的不管是数组还是非数组形式内存空间用两种方式均可。

    

int *a = new int[10];
delete a;
delete [] a;

此种情况的释放相关相同,在于:分配简单类型内存时,内存大小已经确定,系统可以记忆并且管理。在析构时,系统并不会调用析构函数,它直接通过指针可以获取实际分配的内存空间,哪怕是一个数组内存空间(在分配过程中,系统会记录分配内存的大小等信息)

  2.针对class,两种方式体现出具体差异

当你通过下列方式分配一个类对象数组:

  

class A
{private:char *m_cBuffer;int m_nlen;public:A(){m_cBuffer = new char[m_nlen];}~A(){delete[] m_cBuffer;}
}A *a = new A[10];
//仅释放a指针指向的全部内存空间,但是只调用了a[0]对象的析构函数,剩下的从a[1]到a[9]者几个用户自行分配的m_nBuffer对应内存空间将不能释放,从而造成内存泄漏。
delete a;//调用使用类对象的析构函数释放用户自己分配内存空间并且释放了a指针指向的全部内存空间
delete []a;

结如下:

如果ptr代表一个用new申请的内存返回的内存空间地址,即所谓的地址,那么:

delete ptr --- 代表用来释放内存,且只用来释放ptr指向的内存。

delete [] ptr --- 用来释放ptr指向的内存,并逐一调用数组中每个对象的destructor

对应像int/char/long/int*/struct等等简单的数据类型,由于对象没有destructor,所以delete和delete []是一样的。但是涉及到C++对象数组就不同了。

 

new 和malloc内部实现有什么不同

new的功能就是izai堆区新建一个对象,并返回该对象的指针。

所谓的新建对象的指针意思,就是调用该类的构造函数,因为如果不构造的话,就不能称之为一个对象。

而malloc只是机械的分配一块内存,如果用malloc在堆区建立一个对象的话,是不会调用构造函数的。

严格来说malloc不能算是新建一个对象,只能说是分配了一块与该类对象匹配的内存,然后强行把它解释为这是一个对象。

同样的delete去释放一个堆区的对象,会调用该对象的析构函数,而free去释放一个堆区的对象。

转载于:https://www.cnblogs.com/wanghao-boke/p/11351594.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件和流

iostream标准库提供了cin和cout方法用于标准输入读取流和向标准输出写入流。 从文件读取流和向文件写入流,需要用到fstream库。它定了三个数据类型 数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息 ifstream 该数据…

C++预处理器

预处理器是一些指令,指示表一起在实际编译之前所需要完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预指令处理之前。预处理指令不是C语句,所以他们不会以分号(;)结尾。 #define预处理 #define预处理指令用于创…

C++信号处理

信号是由操作系统传给进程的中断,会提早终止一个程序。在UNIX、LINUX、Mac OS或windows系统上,可以通过按Ctrlc产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中被捕获,并可以基于信号采取适当的动作。这些信号是定…

Python—“helloworld”

接触一门计算机新语言,第一件事就是要准备好一个编译器用来打代码。 网上很多环境搭建的方法,具体参照https://www.runoob.com/python/python-install.html 由于我之前一直在使用Ubuntu的gcc编译,恰好也可以运行python程序,我也就…

创建线程

pthread_self函数 获取线程ID。其作用对应进程中 getpid() 函数。 pthread_t pthread_self(void); 返回值:成功:0; 失败:无! 线程ID:pthread_t类型,本质:在Linux下为无符号…

C/C++头文件

C/C头文件一览C、传统 C#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <fstream.h> //文件输入&#xff0f;输出#include <iomanip.h> //参数化…

Python变量类型

变量存储在内存中的值&#xff0c;这就意味着在创建变量时会在内存开辟一个空间。 基于变量的数据类型&#xff0c;解析器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 因此变量可以指定不同的数据类型&#xff0c;这些变量可以存储整数、小数、或字符。 变量…

线程退出

pthread_exit函数 将单个线程退出 void pthread_exit(void *retval); 参数&#xff1a;retval表示线程退出状态&#xff0c;通常传NULL 思考&#xff1a;使用exit将指定线程退出&#xff0c;可以吗&#xff1f; …

线程分离

pthread_detach函数 实现线程分离 int pthread_detach(pthread_t thread); 成功&#xff1a;0&#xff1b;失败&#xff1a;错误号 线程分离状态&#xff1a;指定该状态&#xff0c;线程主动与主控线程断开关系。线程结束后&#xff0c;其退出状态不由其他线程获取&#x…

线程知识点

控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_cancel getpid pthread_self 命名空间 线程属性 本节作为指引性介绍&…

读写锁

读写锁 与互斥量类似&#xff0c;但读写锁允许更高的并行性。其特性为&#xff1a;写独占&#xff0c;读共享。 读写锁状态&#xff1a; 一把读写锁具备三种状态&#xff1a; 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3. 不加锁状态 读写锁特性&#xff1a; 读…

条件变量

条件变量&#xff1a; 条件变量本身不是锁&#xff01;但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。 主要应用函数&#xff1a; pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数 pthread_c…

文件锁

借助 fcntl函数来实现锁机制。 操作文件的进程没有获得锁时&#xff0c;可以打开&#xff0c;但无法执行read、write操作。 fcntl函数&#xff1a; 获取、设置文件访问控制属性。 int fcntl(int fd, int cmd, ... /* arg */ ); 参2&#xff1a; F_SETLK (struct flock *) 设置…

进程间同步

互斥量mutex 进程间也可以使用互斥锁&#xff0c;来达到同步的目的。但应在pthread_mutex_init初始化之前&#xff0c;修改其属性为进程间共享。mutex的属性修改函数主要有以下几个。 主要应用函数&#xff1a; pthread_mutexattr_t mattr 类型&#xff1a; 用于定义…

Python3字符串

字符串是Python中最常用的数据类型&#xff0c;可以使用单引号或双引号来创建字符串 创建字符串很简单&#xff0c;为变量分配一个值即可。 val1 ‘hello world’ var2 “Runoob” Python访问字符串的值 Python不支持单字符类型&#xff0c;单字符在Python中也是作为 一个字符…

服务器客户端编程

server 下面通过最简单的客户端/服务器程序的实例来学习socket API。 server.c的作用是从客户端读字符&#xff0c;然后将每个字符转换为大写并回送给客户端。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #incl…

Python3元组

Python的元组与列表相似&#xff0c;不同之处在于元组的元素不能修改 元组使用小括号&#xff0c;列表使用方括号 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 创建空元组 tup1 (); tup2 (1,) 元组只包含一个元素时&#xff0c;需要在…

Python3字典

字典是另一种可变容器模型&#xff0c;可存储任意类型的对象。 字典的每个键值(key>value)对用冒号分隔&#xff0c;每个对之间用逗号分隔&#xff0c;整个字典包括在花括号里&#xff0c;格式如下 d {key1 : value,key2 : value2} 键必须是唯一&#xff0c;但值则不必。 值…

线程回收

pthread_join函数 阻塞等待线程退出&#xff0c;获取线程退出状态 其作用&#xff0c;对应进程中 waitpid() 函数。 int pthread_join(pthread_t thread, void **retval); 成功&#xff1a;0&#xff1b;失败&#xff1a;错误号 参数&#xff1a;thread&#xff1a;线…

Python3数字

Python3数字数据类型用于存储数值。 数据类型是不允许改变的&#xff0c;这就意味着&#xff0c;如果改变数字数据类型的值&#xff0c;将重新分配内存空间。 Python支持三种不同不同的数值类型&#xff1a; 整型&#xff08;int&#xff09;&#xff1a;通常是被称为整型或整数…