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

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语言中可以使用结构体、数组、指针等方式来实现队列。本文将介绍如何使用数组实现队列。 实现过程 使用数组实现队列需要定义两个指针:一个指向队列头,一个指向队列尾。 1. 定义队列结构体 结构体定义如下,其中front为队列头指针,rear为队列尾指针,maxSize为队列容量,a…

    C 2023年5月23日
    00
  • C++中的memset用法详解

    C++中的memset用法详解 什么是memset函数 memset函数是C++ STL库中的一个函数,它的作用是对一块内存空间进行初始化赋值。memset可以将一段内存空间的每一个字节都设置成相同的值,例如将一个数组中的所有元素都设置为0。 memset函数的语法 memset函数的语法如下: void *memset(void *ptr, int val…

    C 2023年5月23日
    00
  • C/C++ 获取Windows系统的位数32位或64位的实现代码

    获取Windows系统的位数(32位或64位)可以使用以下两个API函数: GetSystemWow64DirectoryA(): 该函数用于获取系统WoW64目录的路径,其中WoW64指的是Windows-on-Windows 64,它是一种允许32位应用程序在64位Windows操作系统上运行的技术。该函数存在后,Windows操作系统具备x64版本和x…

    C 2023年5月23日
    00
  • 三星Galaxy Book Flex值得入手吗 三星笔记本Galaxy Book Flex详细评测

    三星Galaxy Book Flex值得入手吗 三星笔记本Galaxy Book Flex详细评测 如果你正在寻找一款高性能、轻巧、功能强大的2合1笔记本,那么三星Galaxy Book Flex绝对值得一看。该笔记本采用最新一代的处理器,配备高清触摸屏和可旋转键盘,具备出色的性能和灵活的使用方式,让你随时随地体验高效便捷的计算体验。 性能和硬件 三星Gal…

    C 2023年5月22日
    00
  • C++实现图书馆管理系统源码

    C++实现图书馆管理系统源码的完整攻略 介绍 图书馆管理系统是一种典型的信息管理系统,该系统主要用于管理各种类型的书籍、借阅记录以及对书籍的分类管理等相关功能。在此,我们将在C++的基础上,为大家提供图书馆管理系统的完整攻略。 准备工作 在实现该系统前,我们需要对C++基础知识有一定的了解,并在此基础上掌握常用的STL容器。同时,还需要对文件读写有一定的了解…

    C 2023年5月23日
    00
  • GCC 指令详解及动态库、静态库的使用方法

    GCC 指令详解及动态库、静态库的使用方法 GCC 是一个重要的编译器套件,可用于编译包含多种语言的程序。在本文中,我们将深入探讨 GCC 的一些重要指令,并详细介绍动态库和静态库的使用方法,以帮助读者更好地了解和使用 GCC。 GCC 的一些重要指令 编译源代码 GCC 的最常用指令之一就是编译源代码。要编译一个源代码文件,并生成一个可执行文件,可以使用以…

    C 2023年5月23日
    00
  • c++中do{…}while(0)的意义和用法

    当我们希望一个块语句可以像一个普通的表达式一样使用时,就可以使用C++中的do-while(0)语法。 do-while(0)是一个完整的语法块,由关键字“do”和“while”及他们所包含的部分组成,这个语法块被包含在一对圆括号中。这种块语句通常用于宏展开。 do-while(0)主要有以下两个作用: 使块语句可以像表达式一样使用 使用do-while(0…

    C 2023年5月23日
    00
  • Perl 函数集小结

    Perl 函数集小结 – 完整攻略 什么是 Perl 函数 Perl 函数是一段可重复使用的代码,用于实现某个具体的功能。Perl 中的函数通常带有参数,有时会返回值。Perl 函数通常需要先定义后使用。 Perl 函数的定义 在 Perl 中定义函数的语法如下: sub function_name { # 函数体 } 其中,function_name 为函…

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