【C/C++】malloc 或者 new 动态分配内存

1. malloc 是一个在 C 语言中用于动态分配内存的函数。

通过 malloc 函数,我们可以在程序运行时请求一定大小的内存块,然后将该内存块用于存储数据。

malloc 函数的声明如下:

void* malloc(size_t size);

它接受一个参数 size,表示请求的内存块的字节数。函数返回一个 void* 类型的指针,指向分配的内存块的起始地址。

下面是 malloc 函数的基本用法示例:

#include 

int main() {
    int* ptr = (int*)malloc(sizeof(int));
    if (ptr != NULL) {
        *ptr = 42;
        free(ptr);  // 使用完内存后需要手动释放
    }
    
    return 0;
}

在这个示例中,我们首先使用 malloc(sizeof(int)) 分配了一个能容纳一个整数的内存块。sizeof(int) 用于获取一个整数类型的字节数,以确保分配的内存块足够容纳一个整数。由于 malloc 返回的是一个 void* 类型的指针,我们将其强制转换为 int* 类型的指针,以便能够正确操作内存块。

接下来,我们通过 if (ptr != NULL) 来检查分配内存是否成功。malloc 在分配内存失败时会返回 NULL,因此我们需要进行这个检查以确保分配成功。

在使用完分配的内存后,我们需要调用 free 函数来手动释放内存。这是非常重要的,因为动态分配的内存不会在作用域结束时自动释放,必须显式地调用 free 来释放它,以避免内存泄漏。

需要注意的是,malloc 分配的内存是未初始化的,它的值是不确定的。如果需要初始化内存,可以使用 calloc 函数来代替 malloc。此外,如果需要重新分配已经分配的内存块的大小,可以使用 realloc 函数。

2. 在 C++ 中,可以使用 malloc 来分配内存空间,但更常见的做法是使用 new 运算符。

C++ 提供了 newdelete 运算符来进行动态内存分配和释放,相比于 mallocfree,它们更适用于 C++ 对象的创建和销毁。

下面是 new 运算符的基本用法示例:

#include 

int main() {
    int* ptr = new int;
    if (ptr != nullptr) {
        *ptr = 42;
        delete ptr;  // 使用完内存后需要手动释放
    }
    
    return 0;
}

在这个示例中,我们使用 new int 分配了一个能容纳一个整数的内存空间,并将返回的指针赋值给 ptr。与 malloc 不同,new 运算符返回的是一个与所分配类型相匹配的指针,无需进行类型转换。

类似地,我们可以使用 new 运算符来分配更复杂的类型,例如类对象:

#include 

class MyClass {
public:
    MyClass() {
        std::cout << "Constructor called!" << std::endl;
    }
    
    ~MyClass() {
        std::cout << "Destructor called!" << std::endl;
    }
};

int main() {
    MyClass* obj = new MyClass;
    delete obj;  // 使用完对象后需要手动释放
    
    return 0;
}

在这个示例中,我们定义了一个名为 MyClass 的类,该类具有构造函数和析构函数。使用 new MyClass 分配了一个 MyClass 类型的对象,并将返回的指针赋值给 obj。当调用 delete obj 时,析构函数会被调用来释放对象占用的内存。

需要注意的是,C++ 中的 newdelete 是成对使用的,分配和释放的方式必须匹配。不要混用 mallocnew 进行内存分配和释放,也不要混用 freedelete。这是因为 mallocfree 是 C 语言的库函数,无法调用对象的构造函数和析构函数,而 newdelete 是 C++ 运算符,能够正确地管理对象的生命周期。

总结起来,C++ 中可以使用 new 运算符来进行动态内存分配,更适用于 C++ 对象的创建。使用 delete 运算符来手动释放动态分配的内存空间,确保正确释放资源。

你可能感兴趣的:(C/C++,c语言,c++,java)