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

C++动态内存管理:

在C++程序中对任何内置或用户自定义的类型控制的内存进行分配与释放。

C++动态内存分配使用的符号
new / delete (C++内置类型)

动态内存分配new的优势,可以在运行时动态分配内存的大小:

在C语言中声明一个字符串数组如下:

char a[1000];

但是如下模式不能通过,原因是char 声明的字符串的大小必须是常量,如下模式不能通过编译

int  a = 10000;

char c[a];

但是对于new生成的存储空间则不存在以上问题,new申请的内存可以运行时动态决定,可以不占用大量额外的存储空间

#include <windows.h>
#include <cstdio>
#include <iostream>

using namespace std;

#pragma warning(disable:4996)

int main(){
	/*
	printf("%d\n", sizeof(unsigned long));
	printf("%d\n", sizeof(DWORD));
	printf("%d\n", MAXDWORD);
	printf("%d\n", 'D');
	printf("%d\n", (int)'A');
	int a = 0x15;
	int b = 015;
	printf("%d %x\n", a, a);
	printf("%d %o\n", b, b);

	printf("%d\n", VK_ESCAPE);*/

	int c = 10000;
	//char d[c]
	char *q = new char[c];

	strcpy(q, "Hi,");
	strcat(q, "KeMeng~");

	printf("%s\n", q);
	delete[] q;

	return 0;
}

动态分配内存需要注意的规则:

1.正确用法:使用delete[] 将分配的数组空间进行释放

2.正确用法:使用delete 删除单个元素

错误用法:对于对象数组,如果使用的是delete而不用delete[],将导致运行时逻辑错误。

代码:

#include <cstdio>
#include <iostream>

using namespace std;

class Point{
private:
	static int count;
	int x;

public:
	Point() {
		printf("constructor called\n");
		x = ++Point::count;
	}

	Point(const Point &B){
		printf("copy constructor called\n");
		x = ++Point::count;
	}

	~Point(){
		printf("xx %d\n", x);
	}

	Point XX(Point &x)
	{
		//this->x = 0;

		return x;
	}

	void print()const{
		printf("%d\n", x);
	}

};

int Point::count = 0;

int main(){
	Point* pt = new Point[100];

	delete pt;

	printf("haha\n");

	return 0;
}

错误用法:用delete[]删除单个元素的结果没有定义。

#include <cstdio>
#include <iostream>

using namespace std;

class Point{
private:
	static int count;
	int x;

public:
	Point() {
		printf("constructor called\n");
		x = ++Point::count;
	}

	Point(const Point &B){
		printf("copy constructor called\n");
		x = ++Point::count;
	}

	~Point(){
		printf("xx %d\n", x);
	}

	Point XX(Point &x)
	{
		//this->x = 0;

		return x;
	}

	void print()const{
		printf("%d\n", x);
	}

};

int Point::count = 0;

int main(){
	/*
	Point* pt = new Point[100];

	delete pt;
	*/
	Point *pt = new Point;

	printf("haha\n");

	delete[] pt;

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 00:30:09

C++的动态内存管理,new/delete的相关文章

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

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

动态内存管理---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