C++中new的用法

一、普通new的使用

new是C++中一个关键字,用于在运行时动态地分配内存,使用new运算符可以将对象的指针存储在变量中。通过new创建的对象存储在堆内存中,其生命周期不依赖于代码块,需要开发者手动删除才能释放内存。

下面是一个使用new来分配和释放内存的示例代码:

#include <iostream>

int main() {
    int* ptr = new int(5); //分配一个整型变量的内存空间,并将其初始化为5,返回其指针
    std::cout << *ptr << std::endl; //输出该指针指向的内存空间的值(即5)
    delete ptr; //释放该指针指向的内存空间
    
    return 0;
}

在这个示例中,使用new动态分配了一个整型变量的内存空间,并将其指针存储在ptr变量中。通过使用指针访问这个新分配的内存空间,可以修改或读取其中的数据。最后使用delete释放了内存。

二、使用new创建动态数组

new同样也可以用于创建动态数组。创建数组时需要在类型后面添加方括号[],并在方括号内指定数组的大小。下面是一个使用new创建动态数组的示例代码:

#include <iostream>

int main() {
    int* ptr = new int[5]; //分配一个包含5个整型变量的内存空间,返回其首地址
    for(int i = 0; i < 5; i++) {
        ptr[i] = i; //将数组中的元素初始化为其下标值
    }

    for(int i = 0; i < 5; i++) {
        std::cout << ptr[i] << " "; //依次输出数组中的元素
    }
    std::cout << std::endl;
    delete[] ptr; //释放该数组占据的内存空间
    
    return 0;
}

在这个示例中,使用new动态创建了一个包含5个整型变量的数组,为数组中的每个元素赋值,并依次输出它们的值。最后使用delete[]关键字释放了数组占据的内存空间。

三、使用new创建自定义类型

new同样适用于创建自定义类型的对象。需要注意的是,由于C++类可以拥有自己的构造函数和析构函数,因此创建自定义类型的对象时需要调用正确的构造函数。下面是一个使用new创建自定义类型对象并释放内存的示例代码:

#include <iostream>

class Person {
public:
    Person(std::string n, int a) : name(n), age(a) { //构造函数
        std::cout << "create a person" << std::endl;
    }
    ~Person() { //析构函数
        std::cout << "delete a person" << std::endl;
    }
    std::string name;
    int age;
};

int main() {
    Person* ptr = new Person("Alice", 18); //创建一个Person对象,并传入构造函数参数,返回其指针
    std::cout << "name: " << ptr->name << ", age: " << ptr->age << std::endl;
    delete ptr; //释放该Person对象占据的内存空间
    
    return 0;
}

在这个示例中,使用new动态创建了一个Person对象,并通过调用Person类的构造函数进行初始化。然后通过使用指针访问对象的成员变量并输出它们的值,最后使用delete释放了内存。

四、使用new创建对象数组

同样地,new也可以创建对象数组。需要调用对象的默认构造函数来创建对象数组。下面是一个使用new创建对象数组并释放内存的示例代码:

#include <iostream>

class Person {
public:
    Person() { //构造函数
        std::cout << "create a person" << std::endl;
    }
    ~Person() { //析构函数
        std::cout << "delete a person" << std::endl;
    }
};

int main() {
    Person* ptr = new Person[5]; //创建长度为5的Person对象数组,并返回其首地址
    delete[] ptr; //释放该对象数组占据的内存空间
    
    return 0;
}

在这个示例中,使用new动态创建了一个长度为5的Person对象数组,并通过调用Person类的构造函数来初始化数组中的每个元素。最后使用delete[]释放了该对象数组占据的内存空间。

五、使用new时要注意的问题

虽然new可以被用来创建动态对象和数组,但是使用new时也有一些需要注意的问题。

首先,使用new创建的对象不会被自动释放。开发者需要手动使用delete或者delete[]来释放内存空间。如果开发者忘记释放内存,那么这些内存空间将一直存在于系统中,占据着宝贵的内存资源,造成内存泄漏。

其次,使用new时需要考虑分配的内存空间是否满足要求,如是否为NULL等。如果分配内存空间失败,会抛出std::bad_alloc异常。为避免这种情况,开发者可以通过判断返回指针是否为NULL来确保内存分配成功。

总之,new是C++中动态内存分配的主要方式之一,开发者需要了解其用法,合理使用该关键字,以避免不必要的内存泄漏或者程序崩溃。

原创文章,作者:SWHGM,如若转载,请注明出处:https://www.506064.com/n/332361.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SWHGMSWHGM
上一篇 2025-01-21 17:30
下一篇 2025-01-21 17:30

相关推荐

  • Python中new和init的区别

    new和init都是Python中常用的魔法方法,它们分别负责对象的创建和初始化,本文将从多个角度详细阐述它们的区别。 一、创建对象 new方法是用来创建一个对象的,它是一个类级别…

    编程 2025-04-29
  • JavaScript中使用new Date转换为YYYYMMDD格式

    在JavaScript中,我们通常会使用Date对象来表示日期和时间。当我们需要在网站上显示日期时,很多情况下需要将Date对象转换成YYYYMMDD格式的字符串。下面我们来详细了…

    编程 2025-04-27
  • 如何使用return new crontrigger(cron).nextexecutiontime(triggercontext)实现定时调度

    如果你正在寻找一种可靠且简单的方式来实现定时调度,那么你可能需要了解return new crontrigger(cron).nextexecutiontime(triggerco…

    编程 2025-04-27
  • 深入剖析c++中new的用法

    一、c++中new关键字的概述 new关键字是c++中用来动态地分配内存空间的操作符。使用new运算符可以在程序运行时从堆(heap)中分配内存空间,而delete运算符则可以释放…

    编程 2025-03-12
  • new Date().getTime()详解

    在学习JavaScript基础和开发过程中,我们经常会用到时间处理的相关功能,其中一个重要的方法就是new Date().getTime()。new Date()是一种常用的时间对…

    编程 2025-02-25
  • JavaScript中的new Map()

    一、Map Map是JavaScript中的一种可迭代的键值对容器,其中每个键和值可以是任何类型。在ES6中被提出,它可以用来存储和操作键值对数据。 const myMap = n…

    编程 2025-02-05
  • c++ new用法全解析

    一、动态内存分配 c++ new主要用于动态内存分配,可以在程序运行时根据需要分配内存空间。使用new创建的变量是存储在堆上,因此不会随着函数的结束而被清除。 下面是一个简单的示例…

    编程 2025-01-27
  • 深入了解new RegExp

    一、RegExp是什么 RegExp(正则表达式)是JavaScript中处理字符串的强大工具,可以使用它来做验证、替换和提取等操作。在JavaScript中,RegExp是一个内…

    编程 2025-01-27
  • new与malloc的区别和使用

    一、new和malloc的基本概念 new和malloc都是用于动态分配内存的函数。dynamic memory allocation是指在程序运行时动态分配内存,也称堆分配(he…

    编程 2025-01-27
  • New和Malloc的区别

    一、New和Malloc的作用 New和Malloc都是动态内存分配的函数,可以在程序运行时为变量动态分配内存。 New是C++的标准运算符,它为对象动态分配内存,并调用构造函数初…

    编程 2025-01-27

发表回复

登录后才能评论