码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-31 16:18:35      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:c++   new   动态分配内存   

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++的动态内存管理,new/delete

标签:c++   new   动态分配内存   

原文地址:http://blog.csdn.net/u010003835/article/details/47169717

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!