C++深入讲解new与deleted关键字的使用

yizhihongxing

C++深入讲解new与delete关键字的使用

在C++中,我们可以通过new关键字动态地分配内存,通过delete关键字释放已经分配的内存。newdelete是C++中动态内存管理的必备工具,掌握它们的使用方法对于C++程序员来说至关重要。

本文将详细介绍newdelete的用法以及注意事项。

基本用法

动态分配内存

我们可以使用new关键字从堆中动态地分配内存,如下所示:

// 分配一个int类型的内存块
int *p = new int;

这行代码会在堆上分配一个int对象的内存块,并把它的地址赋值给指针p

注意,我们不需要手动计算内存块的大小,由编译器自动根据类型大小来分配内存。

初始化动态分配的内存

我们可以在使用new分配内存时,指定初始值,如下所示:

// 分配一个int类型的内存块,并初始化为0
int *p = new int(0);

这行代码会在堆上分配一个int对象的内存块,并把它初始化为0。

释放内存

我们可以使用delete关键字来释放已经分配的内存,如下所示:

// 释放p指向的内存块
delete p;

这行代码会释放指针p指向的堆内存块。注意,使用delete时,必须确保指针指向的内存块已经被分配。如果指针指向的内存块没有被分配,或者已经被释放,那么会导致不可预知的后果。

数组的动态分配

除了动态分配单个对象外,我们还可以使用new关键字动态分配一个数组。下面是一个例子:

// 分配一个包含10个int类型对象的数组
int *arr = new int[10];

这行代码会在堆上分配一个包含10个int对象的数组,并把它的首地址赋值给指针arr

注意,与单个对象的动态分配不同,动态分配数组时必须手动指定数组大小。

对动态分配的数组进行初始化

与单个对象的动态分配一样,我们也可以在动态分配数组时进行初始化。下面是一个例子:

// 分配一个包含10个int类型对象的数组,并初始化为0
int *arr = new int[10]{0};

这行代码会在堆上分配一个包含10个int对象的数组,并把它的首地址赋值给指针arr。数组中的所有元素都会被初始化为0。

释放数组的内存

对于动态分配的数组,我们也可以使用delete关键字释放其所占用的内存。如下所示:

//释放arr指向的动态分配的数组
delete [] arr;

这行代码会释放指针arr所指向的动态分配的数组所占用的内存。注意,释放数组内存时必须使用delete[],而不是delete

总结

在C++中,newdelete是动态内存管理的基本工具。通过new,我们可以从堆中动态分配内存,并进行初始化;通过delete,我们可以释放已经分配的内存。对于数组的动态分配,我们也可以使用new[]delete[]来进行操作。

在使用newdelete的过程中,需要注意避免内存泄漏和非法访问等问题,以保证程序的正确执行。

示例1:

// ClassA.h
#include <iostream>
class ClassA{
private:
    int* nums;
    int size;
public:
    ClassA(int size){
        nums = new int[size];
        this->size = size;
    }

    void show(){
        for(int i=0;i<size;++i){
            std::cout<<nums[i]<<" ";
        }
        std::cout<<std::endl;
    }

    ~ClassA(){
        delete [] nums;
        std::cout<<"~ClassA"<<std::endl;
    }
};
#include "ClassA.h"

int main(){
    ClassA* obj = new ClassA(5);
    obj->show();

    delete obj;

    return 0;
}

输出:

0 0 0 0 0 
~ClassA

示例2:

// ClassB.h
#include <iostream>
class ClassB{
private:
    int* nums;
    int size;
public:
    ClassB(int size){
        nums = new int[size]{1,2,3,4,5};
        this->size = size;
    }

    void show(){
        for(int i=0;i<size;++i){
            std::cout<<nums[i]<<" ";
        }
        std::cout<<std::endl;
    }

    ~ClassB(){
        delete [] nums;
        std::cout<<"~ClassB"<<std::endl;
    }
};
#include "ClassB.h"

int main(){
    ClassB* obj = new ClassB(5);
    obj->show();

    delete obj;

    return 0;
}

输出:

1 2 3 4 5 
~ClassB

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++深入讲解new与deleted关键字的使用 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 如何使用C语言将数字、字符等数据写入、输出到文本文件中

    下面是如何使用C语言将数字、字符等数据写入、输出到文本文件中的攻略。 打开文件 在C语言中,我们通常使用标准库函数fopen()来打开文件。 可以使用下列代码来打开一个名为file.txt的文件。 FILE *fp = fopen("file.txt", "w"); 其中,第一个参数是文件路径,第二个参数是表示要在文件…

    C 2023年5月23日
    00
  • Visual Studio Code配置C/C++开发环境的教程图解

    下面是详细的攻略: Visual Studio Code配置C/C++开发环境的教程图解 一、安装Visual Studio Code 首先,我们需要安装Visual Studio Code,可以直接在官网下载安装包进行安装。安装完成后,打开VS Code。 二、安装C/C++扩展 在VS Code中,我们需要安装C/C++扩展,为C/C++开发提供支持。在…

    C 2023年5月23日
    00
  • Perl时间处理函数用法介绍

    Perl时间处理函数用法介绍 在Perl编程中,时间的处理是非常常见的操作。Perl提供了丰富的时间处理函数,可以方便开发者对时间进行格式化、计算等操作。在本篇文章中,我们将重点介绍Perl时间处理函数的用法和示例。 时间获取函数 localtime() localtime()函数可以获取当前系统时间。它的返回值是一个数组,包含了当前时间的年、月、日、时、分…

    C 2023年5月22日
    00
  • 养成良好的C++编程习惯之内存管理的应用详解

    养成良好的 C++ 编程习惯之内存管理的应用详解 1. 什么是内存管理 内存管理是指在程序运行时,对于计算机内存的的使用进行动态分配、释放和优化的过程,可以有效避免内存泄漏、重复申请等问题。C++ 中常用的内存管理方法包括动态内存分配和智能指针。 2. 动态内存分配 动态内存分配是指在程序执行过程中,手动申请内存并在不需要使用该内存时释放内存,从而获得更大的…

    C 2023年5月23日
    00
  • 头文件和库的区别

    头文件和库是C/C++中常用的两种代码重用方式,虽然它们都可以实现代码复用的功能,但是它们的细节和使用方式有所区别。 头文件的定义和使用 头文件的定义 头文件是一种特殊的源文件,包含一组函数、类或变量的声明。它的主要作用是让源文件能够访问所需的函数、类或变量定义,而不必再重新编写它们的代码。头文件的扩展名为.h。 头文件的使用 使用头文件的过程通常分为两步:…

    C 2023年5月10日
    00
  • 浅谈html特殊字符 编码css3 content:”我是特殊符号”

    下面是关于”浅谈HTML特殊字符编码CSS3 content”的攻略: HTML特殊字符 在HTML中,有一些字符是有特殊含义的,例如<和>用于表示标签的开始与结束,如果我们想要在HTML中显示这些字符本身,就需要使用特殊字符。 特殊字符使用&和;来表示,其中&为特殊字符的开始标记,;为特殊字符的结束标记。例如,&lt;表…

    C 2023年5月22日
    00
  • C语言动态内存分配函数的实现

    下面我为你详细讲解“C语言动态内存分配函数的实现”的完整攻略。 1. 动态内存分配函数 动态内存分配函数包括以下三个函数,都定义在头文件stdlib.h中: malloc():动态分配内存,返回void类型的指针(即void *),指向新分配的内存块的首地址。 calloc():动态分配内存,并在分配时将内存初始化为0,返回void类型的指针(即void *…

    C 2023年5月23日
    00
  • C++类与对象深入之引用与内联函数与auto关键字及for循环详解

    C++类与对象深入之引用与内联函数与auto关键字及for循环详解 引用 引用是C++中一种比指针更加方便的变量别名。引用可以看作一个已定义变量的别名,这个别名可以和变量一样访问其指向的对象。对引用进行读写操作,其实就是对原对象的读写操作。 使用引用的好处在于,它能够简化一些函数调用及赋值操作。在某些情况下,使用引用也能提高代码运行的效率。 引用的定义格式如…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部