动态内存一般指的是堆内存!堆内存可以很大,不像内存中栈的大小大约就2M左右。有的时候,堆内存需要传递。 有一种简单的传递方法,即是采用函数返回值的形式来传递动态内存。使用后,内存释放可以在程序的任意位置释放。举例如下:
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
在这里使用f ree进行了释放。
当使用new和delete的时候,也差不多。
///
只是有的时候,使用delete 还不行,需要使用[]delete .具体理由如下:
当我们用new[]分配的对象是基本数据类型的时候,用delete和delete[]没什么区别,都可以。但是当用new[]分配的对象是自定义类型的时候,必须要用delete[],这样它才会调用每个对象的析构函数,除非你的析构函数没有做任何事。举例如下:
class A
{
private:
char *m_cBuffer;
int m_nLen;
public:
A(){ m_cBuffer = new char[m_nLen]; }
~A() { delete [] m_cBuffer; }
};
A *a = new A[10];
delete a; //仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
delete [] a; //调用使用类对象的析构函数释放用户自己分配内存空间并且 释放了a指针指向的全部内存空间
参考资料:http://wenku.baidu.com/view/0e3d8c1cfc4ffe473368ab5c.html
http://anwj336.blog.163.com/blog/static/8941520920106795122306/