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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u010003835/article/details/47169717