内存"/>
【C/C++】malloc 或者 new 动态分配内存
1. malloc 是一个在 C 语言中用于动态分配内存的函数。
通过 malloc 函数,我们可以在程序运行时请求一定大小的内存块,然后将该内存块用于存储数据。
malloc 函数的声明如下:
void* malloc(size_t size);
它接受一个参数 size
,表示请求的内存块的字节数。函数返回一个 void*
类型的指针,指向分配的内存块的起始地址。
下面是 malloc 函数的基本用法示例:
#include <stdlib.h>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++ 提供了 new
和 delete
运算符来进行动态内存分配和释放,相比于 malloc
和 free
,它们更适用于 C++ 对象的创建和销毁。
下面是 new
运算符的基本用法示例:
#include <iostream>int main() {int* ptr = new int;if (ptr != nullptr) {*ptr = 42;delete ptr; // 使用完内存后需要手动释放}return 0;
}
在这个示例中,我们使用 new int
分配了一个能容纳一个整数的内存空间,并将返回的指针赋值给 ptr
。与 malloc
不同,new
运算符返回的是一个与所分配类型相匹配的指针,无需进行类型转换。
类似地,我们可以使用 new
运算符来分配更复杂的类型,例如类对象:
#include <iostream>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++ 中的 new
和 delete
是成对使用的,分配和释放的方式必须匹配。不要混用 malloc
和 new
进行内存分配和释放,也不要混用 free
和 delete
。这是因为 malloc
和 free
是 C 语言的库函数,无法调用对象的构造函数和析构函数,而 new
和 delete
是 C++ 运算符,能够正确地管理对象的生命周期。
总结起来,C++ 中可以使用 new
运算符来进行动态内存分配,更适用于 C++ 对象的创建。使用 delete
运算符来手动释放动态分配的内存空间,确保正确释放资源。
更多推荐
【C/C++】malloc 或者 new 动态分配内存
发布评论