首页 > 系统相关 >C++ 动态内存

C++ 动态内存

时间:2024-03-04 16:56:13浏览次数:29  
标签:调用 double C++ 运算符 内存 动态内存 new pvalue

C++ 动态内存

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

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

很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。

在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。

如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。

new 和 delete 运算符

new data-type;

在这里,data-type 可以是包括数组在内的任意内置的数据类型,也可以是包括类或结构在内的用户自定义的任何数据类型。让我们先来看下内置的数据类型。例如,我们可以定义一个指向 double 类型的指针,然后请求内存,该内存在执行时被分配。我们可以按照下面的语句使用 new 运算符来完成这点:

double* pvalue  = NULL; // 初始化为 null 的指针
pvalue  = new double;   // 为变量请求内存

如果自由存储区已被用完,可能无法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作:

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

malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。

在任何时候,当您觉得某个已经动态分配内存的变量不再需要使用时,您可以使用 delete 操作符释放它所占用的内存,如下所示:

delete pvalue;        // 释放 pvalue 所指向的内存

使用 new 和 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;
}

结果

Value of pvalue : 29495

数组的动态内存分配

假设我们要为一个字符数组(一个有 20 个字符的字符串)分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示:

char* pvalue  = NULL;   // 初始化为 null 的指针
pvalue  = new char[20]; // 为变量请求内存

要删除我们刚才创建的数组

delete [] pvalue;        // 删除 pvalue 所指向的数组

三维数组测试案例

#include <iostream>
using namespace std;
int main()
{   
    int i,j,k;   // p[2][3][4]
    
    int ***p;
    p = new int **[2]; 
    for(i=0; i<2; i++) 
    { 
        p[i]=new int *[3]; 
        for(j=0; j<3; j++) 
            p[i][j]=new int[4]; 
    }
    //输出 p[i][j][k] 三维数据
    for(i=0; i<2; i++)   
    {
        for(j=0; j<3; j++)   
        { 
            for(k=0;k<4;k++)
            { 
                p[i][j][k]=i+j+k;
                cout<<p[i][j][k]<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
    } 
    // 释放内存
    for(i=0; i<2; i++) 
    {
        for(j=0; j<3; j++) 
        {   
            delete [] p[i][j];   
        }   
    }       
    for(i=0; i<2; i++)   
    {       
        delete [] p[i];   
    }   
    delete [] p;  
    return 0;
}

对象的动态内存分配

对象与简单的数据类型没有什么不同。例如,请看下面的代码,我们将使用一个对象数组来理清这一概念:

#include <iostream>
using namespace std;
class Box
{
   public:
      Box() { 
         cout << "调用构造函数!" <<endl; 
      }
      ~Box() { 
         cout << "调用析构函数!" <<endl; 
      }
};
int main( )
{
   Box* myBoxArray = new Box[4];
 
   delete [] myBoxArray; // 删除数组
   return 0;
}

如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。

所以结果为:

调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!

 

标签:调用,double,C++,运算符,内存,动态内存,new,pvalue
From: https://www.cnblogs.com/uacs2024/p/18052116

相关文章

  • C++ 异常处理
    菜鸟教程C语言中文网程序的错误大致可以分为三种,分别是语法错误、逻辑错误和运行时错误:1)语法错误在编译和链接阶段就能发现,只有100%符合语法规则的代码才能生成可执行程序。语法错误是最容易发现、最容易定位、最容易排除的错误,程序员最不需要担心的就是这种错误。2)逻辑错......
  • 关于SAP-APP机器-R3trans -d报错-R3trans: /lib64/libstdc++.so.6: version `GLIBCXX_
    在SAP-应用-APP-机器上执行如下命令报错awpxxx03:prdadm270>R3trans-dR3trans:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.26'notfound(requiredbyR3trans) 其实之前,使用过一种方法解决这个问题,可以参考笔者另一篇文章《关于Redhat-Linux中-compat-sap-c++的说......
  • 【C++ STL容器set 】std::set 的全方位解析
    装载自知乎(虽然有AI辅助操作,但是确实写得好好):【C++STL容器set】std::set的全方位解析-知乎(zhihu.com)<imgsrc="https://pic3.zhimg.com/v2-cc8068b8931c7f65e9a89717e2ab404e_b.jpg"data-size="normal"data-rawwidth="1024"data-rawheight="1024......
  • C++编译过程
     第一步:.cpp→.i第二步:.i→.s  是汇编文件第三步:.s→.o 此时已经算是目标文件的最终形态了,完整后缀是.obj第四步:通过链接器将用的到的库,如.dll和.o文件连接起来,执行.exe就是相当于执行前面连接起来的这堆文件 详细过程和G++调用参考:https://zhuanlan.zhihu.c......
  • C++ map用法总结(整理)
    (转载补充)原文链接:https://blog.csdn.net/sevenjoin/article/details/819438641,map简介map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value);map以模板(泛型)方式实现,可以存储任意类型的数......
  • [详解-vector] C++必知必会 vector常用各种操作解析
    原文转载自知乎:https://zhuanlan.zhihu.com/p/648650828vector是C++标准库中的一个动态数组容器,它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小。它是一个非常常用且强大的容器,用于存储一系列元素。下面详细介绍vector的使用方法,并提供相应的代码案例。1.包含......
  • C++ 字符串(string)常用操作总结
    转载自知乎回答:https://zhuanlan.zhihu.com/p/553061732由单引号括起来的一个字符被称作char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。字符串字面值的类型实际上就是由常量字符构成的数组,,编译器在每一个字符串后面添加一个空字符('\0'),因此字符串的实际长度要......
  • C++基本知识梳理
    一.命名空间概念:命名空间是新定义的一个作用域,里面可以放函数,变量,定义类等,主要用来防止命名冲突.实现:namespace关键字命名空间名字{命名空间成员}注意点:1.命名空间可以嵌套使用,还可以使用inline关键字实现版本控制(inline修饰的命名空间默认展开到外一层命名空......
  • C++ 接口(抽象类) 虚函数
    接口描述了类的行为和功能,而不需要完成类的特定实现。C++接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用"=0"来指定的clas......
  • C++网上购书系统项目的二次开发
    1.来源该项目来自同学以前的期末大作业:网上购书系统项目。2.运行环境及运行结果(1)运行环境:DevC++(2)运行结果:代码如下:点击查看代码#include<iostream>#include<string>#include<fstream>#include<vector>#include"buyer.h"#include"book.h"#include"order.h&q......