通过 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
函数。
malloc
来分配内存空间,但更常见的做法是使用 new
运算符。C++ 提供了 new
和 delete
运算符来进行动态内存分配和释放,相比于 malloc
和 free
,它们更适用于 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++ 中的 new
和 delete
是成对使用的,分配和释放的方式必须匹配。不要混用 malloc
和 new
进行内存分配和释放,也不要混用 free
和 delete
。这是因为 malloc
和 free
是 C 语言的库函数,无法调用对象的构造函数和析构函数,而 new
和 delete
是 C++ 运算符,能够正确地管理对象的生命周期。
总结起来,C++ 中可以使用 new
运算符来进行动态内存分配,更适用于 C++ 对象的创建。使用 delete
运算符来手动释放动态分配的内存空间,确保正确释放资源。