假设在子函数内部new的数组(double *p = new double[5])
-
该数组在子函数外部能不能再用呢?怎么用呢?
-
子函数结束后数组所在的内存被释放了么?
-
如果没又被释放,那么我们如何用delete释放呢?(不释放会导致内存泄漏)
首先看第一个问题
很明显,指针 p 随着子函数退出后,就不存在了。
那么,如何去找到数组所在的内存呢?很简单,在new数组时,将地址保存在全局变量中。
double * GP;
void testFunction(void)
double * pp = new double[5];//使用new开辟内存
GP = pp; //保存地址到全局指针中
for(int i=0;i<5;i++) //给数组赋值
*(pp+i) = 5;
int _tmain(int argc, _TCHAR* argv[])
testFunction();
cout<<*(GP);
getchar();
return 0;
控制台输出 5
此时第一个和第二个问题都明确了。在子函数外也可以使用该数组,内存也没有被释放。记录地址的方法也可以用来判断内存是否被正确释放(也就是内存是否泄漏)。如果某段内存已经被释放,那么你再去读它,内存里面显示的都是1。
第三个问题,如果不去释放,则会导致内存泄漏。那么怎么去delete呢?
通常我们会想到用 delete [] p;但是p已经不存在了。。。
很简单,我们使用 delete [] 保存的内存指针;
就可以了。
我们用程序验证一下
double *GP,*GP1;
void testFunction(void)
double * pp = new double[5];//使用new开辟内存
GP = pp; //保存地址到全局指针中
GP1 = pp;
for(int i=0;i<5;i++) //给数组赋值
*(pp+i) = 5;
int _tmain(int argc, _TCHAR* argv[])
testFunction();
delete [] GP;
cout<<*(GP1);
getchar();
return 0;
此时,我们同时用两个全局指针记录下地址,一个用来释放内存,另一个去读取内存
控制台输出-2.65698e+303,说明内存已经被成功释放。
当然我们在编程中总不能总用全局指针吧,此时只要在子函数中返回指针就行。
double *GP;
double * testFunction(void)
double * pp = new double[5];//使用new开辟内存
GP = pp; //保存地址到全局指针中
for(int i=0;i<5;i++) //给数组赋值
*(pp+i) = 5;
return pp;
int _tmain(int argc, _TCHAR* argv[])
double * op = testFunction();
delete [] op;
cout<<*(GP);
getchar();
return 0;
此时的GP是用来验证内存是否被释放,结果显示已经被释放了。
我们在程序任何位置new对象都可以,只是要记住对象指针就行,最后别忘了delete
今天突然有几个疑问假设在子函数内部new的数组(double *p = new double[5])该数组在子函数外部能不能再用呢?怎么用呢?子函数结束后数组所在的内存被释放了么?如果没又被释放,那么我们如何用delete释放呢?(不释放会导致内存泄漏)首先看第一个问题 很明显,指针 p 随着子函数退出后,就不存在了。 那么,如何去找到数组所在的内存呢?很简单,在new数组时,将地...
C++的动态内存管理是通过new和delete两个操作来完成的,即用new来申请空间,用delete来释放空间。在使用new和delete时,注意以下原则。
1.new与delete需一一对应
用new操作申请空间,如果申请成功,必须在以后的某个时刻用delete释放该空间,既不能忘记释放,也不能多次释放。前者会引起内存泄露,后者会引起运行时错误。如下面的程序。
#include <iostream>
using namespace std;
int main()
int *p;
p=new int(3);
if(p)
delete p;
delete p;
什么是内存泄漏?
内存泄漏是因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。 其实就是内存在程序运行中动态申请的内存空间由于某种原因程序未释放或无法释放。
C/C++程序中一般我们关心两种方面的内存泄漏:
堆内存泄漏(Heap leak)
堆内存指的是程序执行中依据须要分配通过malloc / calloc / r
在C++中delete指针前不用进行指针是否为空的判断,因为delete的实现已经做了这件事情!
使用delete来delete已释放的指针是一个严重的错误,所以要在delete完一个指针后手动把它置空!
因为delete空指针是安全的。
以下是Bjarne
Stroustrup's C++ Style and Technique FAQ中的
Why does
设计思路:
1.内存泄漏的产生是new操作后,没有执行delete。然而new和delete都是操作符,我们可以使用操作符重载。在new时记录相关信息,在delete时删除该信息。
2.需要记录和删除信息,那么我们可以创建一个结构体(类)保存需要的信息,并将其作为value, 申请空间的地址作为key保存在unordered_map容器中。
3.此时我们需要一个...
1. new/delete 和 new[]/delete[] 要配对使用! 记住这个原则就行;
2. 对于基本数据类型数组,实践证明 delete 和 delete[] 都没问题,但是使用 delete 时 Clion 会提示建议使用 delete[],通过内存泄漏检测可以发现,delete 会触发 **MismatchedFree** 警告,即使没有泄漏,所以建议用了 new[],就要用 delete [] 释放;
3. 对于对象数组,必须使用 delete[] 释放,否则会造成内存泄漏,因为 d