malloc和new的本质区别

目录

一、结论

二、示例

1.实现类T

2.用malloc分配类T的内存空间

3.用new分配类T的内存空间


一、结论

mallocnew 都是用于在运行时动态分配内存的机制。但它们之间存在一些本质的区别,主要是在使用方面,现在我们直接说结论,然后在通过一个案例来理解和加深区别。

二、示例

1.实现类T

我们先来创建一个类T,代码比较简单,主要有一个静态的成员变量count。count作用用来计算创建类T实例数量的多少。代码如下:

复制代码
class T
{
public:
	T()
	{
		a = 10;
		std::cout << "第" << ++count << "个T被构造了" << std::endl;
	}
	~T()
	{
		std::cout << "第" << count-- << "个T被销毁了" << std::endl;
	}
	static int count;
	
	int a;

};
// 初始化静态变量count
int T::count = 0;

需要注意:静态成员变量需要在类外初始化!

2.用malloc分配类T的内存空间

我们用malloc关键字动态分配10个类T大小的空间,同时测试构造函数和析构函数是否发生变化。代码和结果如下:

复制代码
int main()
{
	T* t1 = (T*)malloc(sizeof(T) * 10);
	std::cout << t1->count << std::endl;
	// 释放空间
	free(t1);
}

得出的结果count为0,同时构造函数和析构函数没有触发。可见malloc 只会分配请求的内存大小,并返回一个指向该内存的指针,它不会调用任何构造函数。

3.用new分配类T的内存空间

与malloc同样,我们用new关键字动态分配10个类T大小的空间,同时测试构造函数和析构函数是否发生变化。代码和结果如下:

复制代码
int main()
{
	T* t2 = new T[10];	
	std::cout << t2->count << std::endl;
	// 释放空间
	delete[] t2;
}

得出的结果count为10,同时构造函数和析构函数都会触发。所以new 不仅会分配内存,还会调用对象的构造函数(如果适用)。同样地,当使用 delete 运算符释放内存时,它会调用对象的析构函数。

相关推荐
血色橄榄枝5 小时前
基于用户注册信息的关键词检测挑战赛「Datawhale AI 夏令营」
人工智能·算法·机器学习
Cx330❀6 小时前
【MySQL基础】一文吃透“表的约束”:从 Null/Default 到主外键的终极安全法则
linux·服务器·数据库·c++·mysql·安全
c238566 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
辞旧 lekkk6 小时前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap
帅次7 小时前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable
六点_dn7 小时前
Linux学习笔记-printf命令
linux·运维·算法
遥感知识服务8 小时前
Sentinel-1 + DEM + FwDET + 随机森林:从快速水深初估到多因子误差修正
算法·随机森林·sentinel
来一碗刘肉面8 小时前
顺序表与链表的比较
数据结构·算法·链表
alphaTao8 小时前
LeetCode 每日一题 2026/7/13-2026/7/19
算法·leetcode
nnerddboy8 小时前
脑电信号处理实战 03 | 运动想象脑机接口入门:ERD/ERS、CSP 空间滤波与左右拳想象解码
算法·信号处理