目录
1->阿里巴巴面试题:用malloc开空间用delete去释放会发生什么?
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->专属鼓励师
一遍不会没关系吖,多看几遍,我也是学了好多遍呢,小伙伴们肯定学的又快又好!!!最后希望写的内容对小伙伴们有所帮助,我写的如果有哪里不对的地方请指出来哦!让我们一起进步吖,任何疑问包括心情不好都可以找我聊聊,我很乐意当你的倾听者吖.