当前位置: 首页 > news >正文

【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++ 提供了 newdelete 运算符来进行动态内存分配和释放,相比于 mallocfree,它们更适用于 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++ 中的 newdelete 是成对使用的,分配和释放的方式必须匹配。不要混用 mallocnew 进行内存分配和释放,也不要混用 freedelete。这是因为 mallocfree 是 C 语言的库函数,无法调用对象的构造函数和析构函数,而 newdelete 是 C++ 运算符,能够正确地管理对象的生命周期。

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

http://www.lryc.cn/news/228523.html

相关文章:

  • 如果让你重新开始学 C/C++,你的学习路线会是怎么选择?
  • PCL安装与使用
  • 力扣刷题-二叉树-对称二叉树
  • 常见面试题-计算机网络相关
  • leetcode做题笔记231. 2 的幂
  • AI主播“败走”双11,想用AI省成本的商家醒醒吧,程序员不必担心失业,发展空间依旧很大
  • ◢Django 自写分页与使用
  • 某城高速综合管控大数据大屏可视化【可视化项目案例-04】
  • 如何在Linux下进行文件查看
  • OSG练习:模仿Ventsim制作三维矿井智能通风系统
  • 【数据结构】非递归实现二叉树的前 + 中 + 后 + 层序遍历(听说面试会考?)
  • 32 Feign性能优化
  • 星岛专栏|从Web3发展看金融与科技的融合之道
  • 什么是网络爬虫?
  • 酷柚易汛ERP - 商品库存余额表操作指南
  • 第27期 | GPTSecurity周报
  • 大数据-玩转数据-Flume
  • 【Linux】进程概念IV 进程地址空间
  • Flink在汽车行业的应用【面试加分系列】
  • 智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造
  • Spring Boot(二)
  • 上海亚商投顾:沪指缩量调整跌 高位强势股继续退潮
  • 药理学试卷
  • SpringBoot3-快速入门
  • 具名挂载和匿名挂载
  • ARM串口
  • C++ Qt 学习(文章链接汇总)
  • 2311d9月会议
  • 《算法通关村——二分查找在旋转数字中的应用》
  • C/S架构学习之基于TCP的本地通信(服务器)