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语言实现vector动态数组的实例分享

    下面是使用C语言实现vector动态数组的完整攻略: 什么是vector动态数组 vector是一种动态数组,随着数据的增加,容器动态扩展。vector和数组很相似,但是有个重要的优点,那就是可以动态扩展,放置溢出问题。不过,vector并不是一个内置的C语言数据类型,需要我们通过编程实现。 思路概述 实现一个vector动态数组主要涉及两个方面:存储数据和…

    C 2023年5月23日
    00
  • C语言实现简单的推箱子小游戏

    C语言实现简单的推箱子小游戏攻略 简介 推箱子游戏是一种经典的益智类小游戏。本攻略将介绍如何使用C语言实现简单的推箱子游戏。 程序大致流程 定义地图,使用数组保存地图信息。 根据地图信息输出地图。 玩家输入移动命令,判断是否合法。 移动箱子,更新地图信息。 输出更新后的地图。 判断是否通关。 如过关,输出相应信息,游戏结束。 程序具体实现 定义地图 首先要定…

    C 2023年5月23日
    00
  • 你知道C++中new和delete为什么要匹配使用吗

    当我们在使用 C++ 时,经常使用 new 和 delete 这两个运算符来进行动态内存的分配和释放。而这两个函数必须要配对使用。 为什么要匹配使用new和delete 在使用 new 分配内存时,系统会分配一块合适大小的内存空间,并返回一个指向该空间的指针。这时如果使用 delete 将该指针所指向的内存释放掉,但是如果后续仍然有程序对该指针进行操作,就会…

    C 2023年5月22日
    00
  • C++实现LeetCode(188.买卖股票的最佳时间之四)

    C++实现LeetCode(188.买卖股票的最佳时间之四)攻略 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意: 你不能同时参与多笔交易(即,你必须在再次购买前出售掉之前的股票)。 示例1: 输入:k = 2, p…

    C 2023年5月22日
    00
  • C语言+win32api写窗体应用程序

    C语言+Win32API写窗体应用程序的完整攻略如下: 1.了解Win32API 要使用Win32API编写窗体应用程序,首先需要了解Win32API。Win32API是一组用于操作Windows操作系统的函数和数据类型的应用程序接口。Win32API提供了一些功能强大的函数和数据类型,使得在Windows操作系统上编写应用程序变得更加容易。 2.创建一个W…

    C 2023年5月23日
    00
  • Python特殊属性property原理及使用方法解析

    好的。首先,我们来讲解一下Python中用于面向对象编程的特殊属性property的原理及使用方法。 Python特殊属性property原理及使用方法解析 什么是property? 在Python中,一个对象的属性(包括实例属性和类属性)可以通过一组方法来操作。例如,对于一个Person类,可以通过p.name来获取或设置其姓名属性。但是,有些属性是需要一…

    C 2023年5月22日
    00
  • Python实现将json文件生成C语言的结构体的脚本分享

    下面为你提供 Python 实现将 json 文件生成 C 语言的结构体的脚本分享的完整攻略,具体步骤如下: 1. 安装必要的库 在使用过程中,需要使用 Python 的 json 模块和 os 模块,需要安装,可以使用下面的命令进行安装: pip install json pip install os 2. 读取 json 文件 使用 Python 的 j…

    C 2023年5月23日
    00
  • php判断是否为json格式的方法

    PHP语言中判断是否为JSON格式的方法有很多种,常见的有以下两种方法: 方法一:使用PHP自带的json_decode函数 使用json_decode函数将JSON字符串转换成PHP数组 判断转换结果是否为NULL或者与原始字符串相等 示例代码: function is_json1($string) { $result = json_decode($str…

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