C++ 动态内存

C++ 程序中的内存分为两个部分

a.栈:在函数内部声明的所有变量都将占用栈内存。
b.堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。

 

1.new 运算符

1
为给定类型的变量在运行时分配堆内的内存,返回所分配的空间地址。

 

检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作:

double* pvalue  = NULL;
if( !(pvalue  = new double ))
{
   cout << "Error: out of memory." <<endl;
   exit(1);
 
}

 

  注意:

     关于malloc()函数:malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。

          new不仅分配了内存,还创建了对象。

 

2.delete 运算符

释放它所占用的内存
复制代码
#include <iostream>
using namespace std;
 
int main ()
{
   double* pvalue  = NULL; // 初始化为 null 的指针
   pvalue  = new double;   // 为变量请求内存
 
   *pvalue = 29494.99;     // 在分配的地址存储值
   cout << "Value of pvalue : " << *pvalue << endl;
 
   delete pvalue;         // 释放内存
 
   return 0;
}
复制代码

 

3.数组的动态内存分配

 

a.一维数组

char* pvalue  = NULL;   // 初始化为 null 的指针
pvalue  = new char[20]; // 为变量请求内存
// 动态分配,数组长度为 m 
int *array=new int [m]; 
//释放内存 
delete [] array;

 

b.二维数组(特别注意,二维数组删除时需要按维度删除

复制代码
int **array
// 假定数组第一维长度为 m, 第二维长度为 n
// 动态分配空间
array = new int *[m];
for( int i=0; i<m; i++ )
{
    array[i] = new int [n]  ;
}
//释放
for( int i=0; i<m; i++ )
{
    delete [] arrar[i];
}
delete [] array;
复制代码

 

c.三维数组(同二维)

复制代码
int ***array;
// 假定数组第一维为 m, 第二维为 n, 第三维为h
// 动态分配空间
array = new int **[m];
for( int i=0; i<m; i++ )
{
    array[i] = new int *[n];
    for( int j=0; j<n; j++ )
    {
        array[i][j] = new int [h];
    }
}
//释放
for( int i=0; i<m; i++ )
{
    for( int j=0; j<n; j++ )
    {
        delete array[i][j];
    }
    delete array[i];
}
delete [] array;
复制代码

 

d.对象内存分配

分配方式相同,只是删除时需要注意。

 delete ptr // 代表用来释放内存,且只用来释放ptr指向的内存。
 delete[] rg // 用来释放rg指向的内存,还逐一调用数组中每个对象的 destructor!!

int/char/long/int*/struct 等等简单数据类型,由于对象没有 destructor,所以用 delete 和 delete [] 是一样的!

 

 

 

 

 

 

posted @   风来风往风伤(TiAmo)  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示