文章目录
- 指针分配与释放 :C++ new/delete VS C malloc/free
- C++ new/delete
- C malloc/free
- 指针销毁
- 智能指针
指针分配与释放 :C++ new/delete VS C malloc/free
new
:分配内存、调用类的构造函数。delete
:调用类的析构函数和释放内存(先调用对象的析构函数,然后利用全局的operator delete(一般通过std::free实现)函数释放内存,并不会将指针自动置空。
malloc
和free
只是分配和释放内存。
new
建立的是一个对象,而malloc
分配的是一块内存。
new
建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc
分配的是一块内存区域,用指针访问,可以在里面移动指针。
new
出来的指针是带有类型信息的,而malloc
返回的是void指针。
C++ new/delete
/* new & delete */
Obj *a = new Obj;
//...
delete a;
C malloc/free
/* malloc & free */
Obj *a = (Obj*)malloc(sizeof(obj));
a->Intialize();
// ...
a->Destroy();
free(a);
malloc/free不能执行构造与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。
指针销毁
if (p != NULL)
{delete p; // 仅删除p中内容,p不为空p == NULL; // 指针设为空,防止二次delete崩溃
}
int* ,char* 等只要不是new的,不用释放,系统会自动把他们占的内存释放掉,只有new的才会手动的去delete。局部变量,存在于栈上,比如int *p;p在栈上,而且p的值也是栈的一个地址。
但是当int *p = new int ;这时候,p这个变量是在栈上的。但是p的值是一个地址,这个地址是堆上的一个地址。如果不delete p;那么,这个地址会一直被占用着,不能被其他的对象所使用。
因此栈的空间会自动释放,而堆里的空间必须手动释放。
智能指针
:指针自动销毁
unique_ptr
shared_ptr
intrusive_ptr