动态内存管理---new&delete

动态内存管理

动态对象(堆对象)是程序在运行过程中在动态内存中用new运算符创建的对象。

由于是用户自己用new运算符创建的,因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存。

计算机内存数据区常有三种分区,即静态数据区、堆区、桟区。

1.程序在编译时就为静态变量和静态对象分配了静态数据存储区。在静态数据区中存储的变量或对象在该程序的整个运行期间都存在,

它们的生命周期贯穿整个程序的运行周期。比如全局变量、static(静态)变量等都是存储在静态数据区。

2.调用函数时,函数内的局部变量和形式参数等将在桟区中分配存储单元。这部分变量的生命周期与函数的执行时间相同。

当函数执行结束时,存储这些变量的存储单元会被自动释放,从而这些变量的生命周期也就结束了。

由于桟区的大小一般很有限,因此能够同时保存在桟区中的变量数量有限。

由于存储在桟区中的变量生命周期短,因此桟区的使用率高很高,可以不断成为新生成变量的存放空间。

3.当执行new运算符时,系统会自动在动态内存空间中分配存储,动态内存位于堆区,它是唯一一个生存期可以由程序员自己控制的存储空间。

程序在运行时程序员可以用new申请动态内存空间,但不用时,程序员必须自己用delete释放这部分空间(释放内存)。

因此,程序在这部分出错的概率极高。

管理动态内存空间的运算符是new和delete,还有new[]与delete[].

C语言中用 malloc()和free()函数申请分配和释放动态内存空间。

C++用new和delete运算符来申请分配和释放动态内存空间。

new运算符可以自动计算所申请空间的大小,而malloc()函数则必须由程序员指出所需申请分配空间的大小。

#include<iostream>
using namespace std;

int main()
{
	char *p1;
	int *p2;
	int *p3=new int (14);
	int *p4=new int [3];

	p1=new char;     //new一个整型数,并将该整型数的地址赋值给p1
	p2=new int (10);//new一个初值为200的整型数,并将该整型数的地址赋给p2

	*p1=97;

	for(int i=0;i<3;i++)
	{
		cin>>*(p4+i);
	}

	cout<<*p1<<endl;
	cout<<*p2<<endl;
	cout<<*p3<<endl;

	for(int i=0;i<3;i++)
	{
		cout<<*(p4+i)<<" ";
	}
	cout<<endl;

	delete p3;
	delete p2;
	delete p1;
	delete []p4;

	p1=NULL;
	p2=NULL;
	p3=NULL;
	p4=NULL;

	system("pause");
	return 0;
}

注意:

1.当系统无法满足动态内存分配的请求时他将会返回NULL,所以new执行后必须判断返回的指针值是否为NULL,是则表示动态内存分配不成功。

只有返回值是非NULL时,才可继续执行后续的操作。

如果对一个,一申请成功的指针进行相关的内存操作将可能引起系统崩溃。

2.delete只能用来释放用new申请分配的动态内存空间;反之,new申请的动态内存空间必须用delete来释放。

delete与new必须有对应的关系。

3.delete执行之后,指针所指向的内存空间就被释放了,而指向该动态内存区域的指针变量本身并不会因为delete有任何改变。

4.delete之后,不对指针变量做任何处理,就会造成“指针悬挂”;

5.指针变量声明后没有进行初始化就通过它操作内存空间,则可能制造一个“野指针”;

6.关于指针和动态内存要特别注意:

指针消亡了,并不代表它所指向的动态内存会被自动释放,自动消亡;

动态内存被释放了,并不代表指向该动态内存的指针变量会消亡或自动变成NULL;

做到以下几点:

1.定义指针变量的同时初始化。如不初始化就一定要将其设置成NULL,避免该指针指向一个不确定的地方,引发误操作,这是非常危险的。

一旦把它置成NULL,误用它就不会造成太大问题;

2.delete指针以后,第一时间将其设置为NULL。即使是一个马上就要消亡的局部指针变量,也可立即将其置成NULL。养成良好的习惯是避免错误的有效方法;

3.当指针指向数组时,一定谨慎防止指针越界操作;

4.避免用指针传递桟内存,避免返回一个即将自动消亡的局部变量或局部对象的地址。

桟内存中的局部变量和局部对象都不能跨函数生存,要注意它们的生存周期。

时间: 2024-11-08 10:06:06

动态内存管理---new&delete的相关文章

C++的动态内存管理,new/delete

C++动态内存管理: 在C++程序中对任何内置或用户自定义的类型控制的内存进行分配与释放. C++动态内存分配使用的符号 new / delete (C++内置类型) 动态内存分配new的优势,可以在运行时动态分配内存的大小: 在C语言中声明一个字符串数组如下: char a[1000]; 但是如下模式不能通过,原因是char 声明的字符串的大小必须是常量,如下模式不能通过编译 int  a = 10000; char c[a]; 但是对于new生成的存储空间则不存在以上问题,new申请的内存可

动态内存管理---new&amp;amp;delete

动态内存管理 动态对象(堆对象)是程序在执行过程中在动态内存中用new运算符创建的对象. 因为是用户自己用new运算符创建的.因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. 计算机内存数据区常有三种分区.即静态数据区.堆区.桟区. 1.程序在编译时就为静态变量和静态对象分配了静态数据存储区.在静态数据区中存储的变量或对象在该程序的整个执行期间都存在. 它们的生命周期贯穿整个程序的执行周期.比方全局变量.static(静态)变量等都是存储在静态数据区. 2.调用函数时.函

动态内存管理

(1).c中动态内存管理方式 malloc.calloc.realloc在堆上开辟空间.free将申请的空间释放掉 void *malloc( size_t size );      void *calloc( size_t num, size_t size );      void *realloc( void *memblock, size_t size ); (2).C++中动态内存管理 通过new和delete运算符进行动态内存管理 (3).malloc/free和new/delete的

c++中的动态内存管理

c++中的动态内存管理问题 c++中使用new和delete实现动态内存管理.new和delete实现动态管理对象,new[]和delete[]实现动态管理对象数组.c++中的new和delete运算符均使用我们c中学过的malloc和delete函数实现动态内存的开辟. 首先,先简单介绍下c中的几个动态内存函数malloc,realloc,calloc,free; void *malloc(size_t size); //动态内存开辟函数 void free(void *pointer);  

动态内存管理(引用计数)

c++的动态内存管理是非常重要的,操作不当很容易引起内存泄漏, 下面我详细写了一些内存管理该注意的地方,包括引用计数的实现 深拷贝浅拷贝 #include <iostream>using namespace std; class String{public: String()  :_str(new char[1]) {  *_str = '\0'; } String(char* str)  :_str(new char[strlen(str)+1])  //开辟一段新空间给_str {  st

c++动态内存管理

一.内存的常见分配方式 1. 从静态区分配,一般是全局变量和static类型变量 2.从栈区分配内存,一般是局部的变量,会随着所在函数的结束而自动释放 3.从堆中分配,一般是使用手动分配,使用malloc()函数和new来申请任意大小空间,不过要手动释放空间,相应的使用free()函数和delete释放, 如果不释放该空间,而且指向该空间的指针指向了别的空间.则该空间就无法释放,造成内存泄露,造成了内存浪费 二.内存的使用规则 1.在使用malloc()或new申请空间时,要检查有没有分配空间成

C++动态内存管理之shared_ptr、unique_ptr

C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存.但在程序中使用new和delete容易导致很多问题,这里列出三个比较容易犯的错误. 我们new了一个对象,但没有delete它.这会引起memory leak内存泄露,可能会导致程序崩溃. 用指针访问一个已经被free的对象.这就是我们常说的dangling pointer. delelte同一个

C++程序设计入门 引用和动态内存管理学习

引用: 引用就是另一个变量的别名,通过引用所做的读写操作实际上是作用于原变量上. 由于引用是绑定在一个对象上的,所以定义引用的时候必须初始化. 函数参数:引用传递 1.引用可做函数参数,但调用时只需 传普通变量即可 2.在被调函数中改变引用变量的值,则改变的是实参的值 #include<iostream> #include<algorithm> #include<cmath> using namespace std; void swep(int &n1,int

C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理

首先我们先了解一下内存: C语言使用malloc/free动态管理内存空间,C++引入了new/delete,new[]/delete[]来动态管理内存.如果大家在自学C++中遇到困难,想找一个学习C++的环境,可以加入我的C++学习交流扣群先是513801371,能够共同学习交流和分享!![](https://s1.51cto.com/images/blog/201905/11/f3795621980960d47c291497e516b846.jpg?x-oss-process=image/w