赞
踩
C++ 在运行时给变量或数组分配内存,也称为动态内存分配。其他语言(如Java, Python)由编译器控制内存,但C++需要手动维护,当不需要时也要手动回收动态创建的内存。本文介绍C++动态内容管理,并通过示例进行说明。
数组包括相同类型数据,大多数情况下声明数组时,内存已经分配。如果分配太小,可能不够使用,反之可能造成浪费。那么最好的办法使用new操作符在运行时动态分配。
下面示例使用new操作符给指针变量分配内存.
// 声明 int 指针
int* pointerVar;
// 动态分配内存
pointerVar = new int;
// 给地址赋值
*pointerVar = 55;
动态分配内存返回地址赋值给指针变量。如果是数组,则返回数组的首地址。
new 语法如下:
pointerVar = new dataType;
已分配的指针变量,当不再使用我们可以使用delete操作符回收内存。
delete操作符语法:
delete pointerVar;
// 声明int指针
int* pointVari;
// 动态分配内存
pointVari = new int;
// 赋值给指针对应地址
*pointVari = 55;
// 打印内存值
cout << *pointVari;
// 回收内存
delete pointVari;
关于delete操作符,下面几点需要说明:
每个C++软件的内存结构可简化为:
是保存包含执行指令的编译程序的地方。它们是只读的,代码段处在堆栈和堆的后面,以避免被覆盖。
是维护全局变量和静态变量的地方,可进行读写。
堆栈是一种预先分配的内存类型。堆栈是后进先出的数据结构。当变量不在作用域内时,内存会被释放。当堆栈变量被移除时,其他变量就可以访问它所使用的内存空间。当函数调用时,会push和pop局部变量,堆栈会扩展和收缩。它跟踪局部变量,返回值地址、实参以及内存状态。
应用程序运行时分配的内存区域。使用new操作符分配内存,而使用delete操作符处理内存。
下面示例展示动态分配基本数据类型。
#include <iostream> using namespace std; int main() { // 声明指针 int* pntInt; // 声明float类型指针 float* pntFloat; // 动态分配内存 pntInt = new int; pntFloat = new float; // 赋值 *pntInt = 55; *pntFloat = 55. 55f; cout << *pntInt << endl; cout << *pntFloat << endl; // 回收内存 delete pntInt; delete pntFloat; return 0; }
输出结果:
55
55. 55
下面示例展示输入学生数量,动态分配数组大小。
#include <iostream> using namespace std; int main() { int numb; cout << "输入学生总数: "; cin >> numb; float* pntr; // 分配内存 pntr = new float[numb] ; cout << "输入成绩:" << endl; for (int c = 0; c < numb; ++c) { cout << "Student" << c + 1 << ": "; cin >> *(pntr + c) ; } cout << "\n显示成绩:" << endl; for (int c = 0; c < numb; ++c) { cout << "Student" << c + 1 << " : " << *(pntr + c) << endl; } // 回收内存 delete[] pntr; return 0; }
输出结果:
输入学生总数: 5
输入成绩:
Student1: 4.4
Student2: 5
Student3: 3
Student4: 7
Student5: 8
显示成绩:
Student1: 4.4
Student2: 5
Student3: 3
Student4: 7
Student5: 8
注意这里使用 delete[] pntr
,[] 表示回收整个数组。
下面示例定义Stud类,其中包括私有变量age,缺省构造函数初始化age为10。main函数中使用new操作符动态构建pntr对象指针。
#include <iostream> using namespace std; class Stud { int age; public: // 构造函数初始化age Stud() : age(10) {} void getAge() { cout << "Age: " << age << endl; } }; int main() { // 动态声明 Student类型对象 Stud* pntr = new Stud() ; // 通过指针调用成员函数 pntr->getAge(); // 回收内存 delete pntr; return 0; }
输出结果:
Age: 10
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。