在编程过程中熟练掌握动态内存的分配必不可少。
在C++中我们新建一个指针对象,之后使用new在栈中申请一片内存空间,并调用对象的构造函数(基本对象类型无构造函数)
简单的动态分配内存方式如下:
double *pvalue; //此时vs会提示无法读取内存
if (!(pvalue = new double))
{
TRACE("Error: out of memory.");
exit(1);
}
*pvalue = 123.456;
TRACE("Value of pvalue:%f\n", *pvalue);
delete pvalue; //此时vs会提示无法读取内存
一维数组动态分配内存:
//如果希望自己定义的指针始终指向新申请的内存空间,可以将指针定义成指针常量
char * const m_c = new char[6]; //此时m_c指向内存中的地址为0x00000000 <NULL>
//m_c = "hello"; //这样写是有问题的,我的本意是想给字符串数组中的每个变量赋值,结果实际是改变了m_c指针指向的地址
m_c[0] = 'h';
m_c[1] = 'e';
m_c[2] = 'l';
m_c[3] = 'l';
m_c[4] = 'o';
m_c[5] = '\0';
//如果在实际编程过程中不小心将m_c指向了一个常量字符串,此处释放m_c指向的内存地址会导致程序出错
delete[] m_c;
二维数组动态分配内存:
//二维数组动态分配内存
int **array;//第一维长度为m,第二维长度为n
int m = 5;
int n = 4;
int i, j;
array = new int *[m];
for (i = 0; i < m; i++)
{
array[i] = new int[n];
}
//数组赋值
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
array[i][j] = i * j;
//释放数组
for (i = 0; i < m; i++)
delete[] array[i];
delete[] array;
malloc申请内存空间和用new申请内存空间的区别
用malloc申请内存空间仅仅是在堆中申请了一片内存空间,并将这片内存空间的类型强制转换为需要的类型
但是并没有真正的新建一个对象,因为并没有调用该对象的构造函数。
new的方式:在开辟内存空间的同时,相当于新建一个对象,会调用对象的构造函数
为了测试,我们可以新建一个类。如下所示:
//头文件
#pragma once
class Test
{
private:
int num1;
int num2;
public:
Test();
~Test();
void print();
};
//实现文件
#include "stdafx.h"
#include "Test.h"
Test::Test()
{
num1 = 10;
num2 = 20;
}
Test::~Test()
{
}
void Test::print()
{
TRACE("num1=%d\n", num1);
TRACE("num2=%d\n", num2);
}
主函数中我们采用不同的方式申请内存
//用malloc申请内存空间和用new申请内存空间的区别
//首先是用malloc申请内存空间
//用malloc申请内存空间仅仅是在堆中申请了一片内存空间,并将这片内存空间的类型强制转换为需要的类型
//但是并没有真正的新建一个对象,因为并没有调用该对象的构造函数。
Test *m_Test = (Test *)malloc(sizeof(Test));
m_Test->print(); //输出为垃圾值
//用new的方式申请内存空间
//new的方式:在开辟内存空间的同时,相当于新建一个对象,会调用对象的构造函数
Test *n_Test = new Test;
n_Test->print();
输出如下所示:
另外自己写了个小程序:利用动态内存分配结构体空间,实现一个不断增长的数据链表,用户一直输入数据,直到用户输入数据0停止。程序如下:
//利用结构体实现链表的功能
struct node
{
//链表中的节点
int data; //数据
int num;
struct node *next;
};
//利用结构体,实现一个不断增长的数据链表
//用户一直输入数据,直到用户输入数据0停止
void struct_link()
{
node *head;//头结点
node *p, *q;
//指针初始化
head = NULL;
p = NULL;
q = new node;
q->num = 1;
int a = -1;
std::cout << "请输入第一个数字";
std::cin >> a;
q->data = a;
head = q;
while (a != 0)
{
p = q;
q = new node; //指针继续申请新的节点
q->next = NULL;
p->next = q;
q->num = p->num + 1;
std::cout << "请输入第" << q->num << "个数字";
std::cin >> a;
q->data = a;
}
//输出用户的输入
q = head;
p = NULL;
while (q->data!=0)
{
printf("%d %d\n", q->num, q->data);
q = q->next;
}
//释放内存
q = head;
p = q;
while (q->next!=NULL)
{
p = q->next;
delete [] q;
q = p;
}
}
在main()函数中调用struct_link()函数就可以看到效果了。