在讲到new和delete不得不想到c语言中的malloc and free 以及其经常用于动态内存分配,而简单来说,动态内存分配在堆中,不会因为离开作用域而删除,而栈中存储的一般为函数参数,返回值以及作用域下的local orient.
那我们可想而知的是,在函数中如果我创建指针,肯定为了不浪费内存,我们选择动态分配内存的方式,那么就是利用C++中的new或者c中的malloc,我们需要养成一个良好的习惯就是记得释放内存不然会造成memory leak,想必大家经常听过这个词,那这里是为什么会造成内存泄漏,假设我们在一个作用域比如
{
char* p = new char[3];
}
此时我们创建了一个指向char型的指针p,但是p没有delete,这时候,一块在heap中创建的char数组依旧存在,而这个地址的别名p因为离开了作用域而无法访问,那么这块内存在整个操作系统中就是无法使用的部分。
所以在内存中,我们使用了new就得伴随着delete。
这时候我们知道p是一个local orient,那么我们还会有一种写法就是static,也就是静态对象或者说全局对象,这种对象在离开作用域时,是不会消失的,他会伴随着程序结束而终结。
{
static int a = 3;
}那么说到这里,我们也会去想知道new到底是怎么工作的,从我的上一篇博客里,我们知道创建一个complex对象需要2个double也就是8个字节,这时候比如有下列的程序
{
complex* p = new complex(0,0);
}这时候我们使用new创建了指向complex(0,0)对象的指针p,而new是先为complex对象分配内存,也就是malloc一个内存大小为sizeof(complex)的堆大小给p指针,然后再在这地址上调用complex的构造函数,创建complex对象。

本文探讨了C++中动态内存分配的区别,包括new、delete与malloc的使用。强调了内存泄漏问题,解释了在函数作用域内使用new时必须配合delete以避免内存泄漏。同时,分析了调试模式下,new操作在内存分配中额外的Debug header和cookie信息,以及在不同模式下的内存对齐策略。最后,提到了new运算符用于数组时的注意事项,指出不使用delete[]可能导致的内存泄漏风险。
最低0.47元/天 解锁文章
239

被折叠的 条评论
为什么被折叠?



