C++内存管理笔记

1.重载new和delete:
void* operator new(size_t size)
{
    void *p = malloc(10);
    return (p);
}

void operator delete(void *p)
{
    free(p);
}
这样是重载全局的
如果需要重载删除数组,需要重载delete[]
写在类里就是重载一个类的new和delete
2.sizeof能获得的是编译时就分配了的内存,new是在程序运行时才分配的。
所以sizeof可以获取到数组的大小,而无法获取到用new分配到的指针的内存大小
(数组和指针本质是一个东西):
    char* szCh = new char(50);
    cout<<sizeof(szCh)<<endl;
    char arrCh[50];
    cout<<sizeof(arrCh)<<endl;

3.复制字符串应该用strcpy函数(#include stdio.h)
4.指针在使用前要先检查:

if(p == NULL)
{
   
//内存没分配成功
}
或者
if(p != NULL)
{
   
//内存已经分配
}

5.指针在使用前要初始化
6.避免访问越界
7.delete指针之后应将其赋值为NULL,避免其成为野指针
8.new和delete要对应,避免内存泄漏

9.sizeof无法计算指针指向的内存大小和范围。因为其是在运行期分配的,而sizeof只能计算编译期分配的内存,即可以计算数组所占内存
10.错误的内存分配函数:
void GetMemory(char* p)
{
    p = new char(255);
}
char* pz =  NULL;
GetMemory(pz);
//pz = NULL
错误原因:p只是pz的副本,而不是pz的内存地址,在函数中分配只是对p进行分配,而不是对pz进行分配,所以执行完GetMemory后仍为NULL
11.正确的内存分配函数:
void GetMemory2(char** p)
{
    *p = new char(255);
}

char* pz =  NULL;
GetMemory(pz);
传进去的是pz的内存地址,所以分配成功
12.更容易理解的内存分配函数:
char* GetMemory3(size_t n)
{
    char* p = new char(n);
    return p;
}
char* pz = NULL;
pz = GetMemory3(255);
函数返回一块内存空间。避免了指针的指针,更容易理解。
13.new/delete、malloc/free应对应使用。
两者可相互替换。new和delete是为了在C++中更容易给对象分配内存:

class CTest
{
    public:
    CTest()
    {
        cout<<"init"<<endl;
    }
    ~CTest()
    {
        cout<<"destory"<<endl;
    }
    void Init()
    {
        cout<<"init"<<endl;
    }

    void Destory()
    {
        cout<<"destory"<<endl;
    }
};

void main()
{


cout<<sizeof(GetString())<<endl;
CTest *t = new CTest;
delete t;
t = NULL;

//    CTest *t;
//    t = (CTest*)malloc(sizeof(CTest));
//    t->Init();
//    t->Destory();
//    free(t);
//    t = NULL;


}

以上两段代码功能一样。
14.能用new/delete时,应尽量用。它更简单好用也更安全:)
15.删除数组应该用delete[],如果简单的用delete,可能造成内存泄漏
16.内存耗尽应立刻退出程序:exit(0);
17.待续

posted @ 2009-04-26 23:20  飘啊飘  阅读(345)  评论(1编辑  收藏  举报