[小白拿捏面试题]第二篇:使用malloc开空间但是却用delete释放空间从内存分析会发生什么?---阿里巴巴面试题

目录

1->阿里巴巴面试题:用malloc开空间用delete去释放会发生什么?

2->针对内置类型来说:如 int char long

1.使用malloc开空间,使用delete释放

2.使用new开空间,使用free释放

3->针对内置类型来说

1.针对内置类型,malloc+delete会发生什么?

2.针对内置类型,new+free会发生什么?

4->总结,建议背下来

5->专属鼓励师


1->阿里巴巴面试题:

        用malloc开空间用delete去释放会发生什么?

2->针对内置类型来说:如 int char long

        1.使用malloc开空间,使用delete释放

        废话不多说,直接上代码跟结果

#include <iostream>

using namespace std;

int main()
{
	//malloc开空间
	int* pi1 = (int*)malloc(sizeof(int));
	*pi1 = 10;
	//delete释放
	delete pi1;
	pi1 = nullptr;

	return 0;
}

 

         可以看到什么错误也没发生,那么继续!

        2.使用new开空间,使用free释放

上代码喽,看结果!

#include <iostream>

using namespace std;

int main()
{
	//new开空间
	int* pi1 = new int(5);
	*pi1 = 10;
	//free释放空间
	free(pi1);
	pi1 = nullptr;

	return 0;
}

         可以看到正常开空间和释放

        以上两组实验说明,对于内置类型来说使用new和malloc开空间效果是一样的,使用delete和free释放空间效果一样.

        在这两份代码示例中,new的内存用free释放, malloc的内存用delete释放,我用VS2022跑了一下是没有报错。原因是 int,float 这种数字类型过于简单,没有复杂的构造/析构函数,因此此时 new 和 malloc在一定程度上是等价的。虽然这里没有出错,但是不推荐这么写,这么写是否有其他未出现的问题也说不准,因为这么写都可能导致未定义行为,想要具体了解的最好看下这本书<<Effective C++>>第三版,这本书真的带给了我极大地帮助,它在国外市场久经不衰!

3->针对内置类型来说

1.针对内置类型,malloc+delete会发生什么?

直接上代码!!!

class A
{
public:
	A()
	{
		p = new char(87);
	}
	~A()
	{
		delete p;
		p = nullptr;
	}
	char* p = nullptr;
};

int main()
{
	//malloc开自定义类型空间
	A* pA = (A*)malloc(sizeof(A));
	//delete释放自定义类型空间
	delete pA;
	return 0;
}

 但是程序直接崩溃!!!

        那么这是为什么呢?为什么用在内置类型身上可以,自定义类型就不行了呢?

        进行分析:类A的指针pA利用malloc生成,malloc不会调用类A的构造函数,所以类A构造函数中的初始化操作 p = new char(100) 不会执行,但是释放的时候调用了delete,delete 会调用类A的析构函数,析构里面做资源清理动作,导致程序崩溃.

        对于自定义类型对象:malloc之后调用delete,不会调用构造函数进行初始化,会调用析构函数进行资源清理。如果析构函数有资源需要清理,程序会崩溃;如果没有资源清理,程序运行成功。

2.针对内置类型,new+free会发生什么?

上面讨论的是malloc和delete混用,那么再看下new和free混用的情况:

class A
{
public:
	A()
	{
		p = new char(100);
	}
	~A()
	{
		delete p;
		p = nullptr;
	}
private:
	char* p = nullptr;
};

int main()
{
	A* pA = new A;
	free(pA);


	return 0;
}

 看结果

         没报错,那么他就真的没问题吗???要知道内存泄漏是不会报错的!!!

        进行分析:这份代码示例,pA是new出来的,调用了类A的构造函数,但是释放的时候用的free,那么不会调用类A的析构函数。析构函数里面有做资源清理的工作,因为没有调用到析构函数,所以出现了内存泄漏问题.

4->总结,建议背下来

        对于自定义类型对象:new之后调用free,不会调用析构函数进行资源清理,会调用构造函数进行资源初始化。如果构造函数有内存资源需要初始化,会导致内存泄漏.
总结:

        先malloc后delete,可能导致程序崩溃问题.
        先new后free,可能出现内存泄漏问题.

5->专属鼓励师

        一遍不会没关系吖,多看几遍,我也是学了好多遍呢,小伙伴们肯定学的又快又好!!!最后希望写的内容对小伙伴们有所帮助,我写的如果有哪里不对的地方请指出来哦!让我们一起进步吖,任何疑问包括心情不好都可以找我聊聊,我很乐意当你的倾听者吖.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫珂蛋儿吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值