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

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

分类:C/C++语言

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;}

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

上一篇C语言中的动态内存分配,malloc/free

顶1踩0

做事的能力往往只能给你一种机会,

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

相关文章:

你感兴趣的文章:

标签云: