您的位置:

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++中动态内存分配的主要方式之一,开发者需要了解其用法,合理使用该关键字,以避免不必要的内存泄漏或者程序崩溃。