c++ new用法全解析

发布时间:2023-05-22

一、动态内存分配

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

#include <iostream>
using namespace std;
int main() {
    int* ptr = new int;
    *ptr = 10;
    cout << "Value of ptr: " << *ptr << endl;
    delete ptr;
    return 0;
}

上述代码中,使用new创建了一个名为ptr的指针,然后把值10存储在指针所指向的地址中。最后使用delete释放内存。

二、数组的动态内存分配

c++ new同样可以用于数组的动态内存分配。使用new创建的数组同样是存储在堆上,因此不会随着函数的结束而被清除。 下面是一个简单的示例代码:

#include <iostream>
using namespace std;
int main() {
    int n = 5;
    int* arr = new int[n];
    for(int i=0; i <n; i++) {
        arr[i] = i+1;
        cout << arr[i] << " ";
    }
    delete[] arr;
    return 0;
}

上述代码中,使用new创建了一个大小为5的数组,然后在for循环中给每个元素赋值并输出。最后使用delete[]释放内存。

三、类的动态内存分配

c++ new还可以用于类的动态内存分配。使用new创建的类对象同样是存储在堆上,因此不会随着函数的结束而被清除。 下面是一个简单的示例代码:

#include <iostream>
using namespace std;
class Person {
public:
    string name;
    int age;
    void introduce() {
        cout << "My name is " << name << ", I'm " << age << " years old." << endl;
    }
};
int main() {
    Person* ptr = new Person;
    ptr->name = "Tom";
    ptr->age = 25;
    ptr->introduce();
    delete ptr;
    return 0;
}

上述代码中,使用new创建了一个名为ptr的Person指针,然后给属性赋值并调用introduce函数。最后使用delete释放内存。

四、new传入参数

c++ new除了可以不带参数创建变量、数组、对象外,还可以传入参数,用于给新创建的变量、数组、对象进行初始化。 下面是一个简单的示例代码:

#include <iostream>
using namespace std;
int main() {
    // 创建大小为5的int数组,并初始化为0
    int* ptr1 = new int[5]();
    for(int i=0; i<5; i++) {
        cout << ptr1[i] << " ";
    }
    delete[] ptr1;
    // 创建double类型变量,并初始化为3.14
    double* ptr2 = new double(3.14);
    cout << *ptr2 << endl;
    delete ptr2;
    return 0;
}

上述代码中,使用new创建了一个大小为5的int数组,并初始化为0;创建一个double类型变量,并初始化为3.14。最后使用delete或delete[]释放内存。

五、自定义new和delete

c++中可以自定义new和delete,来实现动态内存分配的不同需求。例如,可以通过重载类的new和delete函数,实现自己的内存池,提升内存分配效率。 下面是一个简单的示例代码:

#include <iostream>
using namespace std;
void* operator new(size_t size) {
    cout << "Allocating memory with size " << size << endl;
    void* ptr = malloc(size);
    return ptr;
}
void operator delete(void* ptr) {
    cout << "Freeing allocated memory" << endl;
    free(ptr);
}
int main() {
    int* ptr = new int;
    *ptr = 10;
    cout << "Value of ptr: " << *ptr << endl;
    delete ptr;
    return 0;
}

上述代码中,使用了自定义的new和delete函数,用于输出分配内存的大小和释放内存的信息。

总结

本文详细介绍了c++ new的用法,包括动态内存分配、数组的动态内存分配、类的动态内存分配、new传入参数、自定义new和delete。希望本文能够对使用c++进行编程的开发工程师有所帮助。