前言
C语言和C++的指针很多都一样,但也有不一样的,比如给指针动态内存分配的方式,C语言的看《》和《》。
下面简单记录一下C++中的指针的内存分配相关内容。
正文
堆与栈
栈
系统默认分配内存的地方,不需要动态申请,也不需要动态释放。
int number = 0; string name = "biumall.com"
等都是放入栈中的。
栈内存由系统自动分配和回收内存空间
堆
不是系统分配的,需要程序员动态申请内存分配,同时也需要动态释放。
# C语言中 //申请 char *p = (char *) malloc( 100 ); //分配100个字节的内存空间 //释放 free(p);
C语言中可以通过malloc()或calloc()进行申请堆内存,然后通过free()释放。
new 和 delete
C++中,new用于申请动态堆内存空间,delete用于释放动态堆内存空间。、
new
使用格式:
type *p = new type;
p表示指针,new是关键字,type是类型名。new返回新分配的内存单元的地址。
delete
delete p;
p表示指针。为了安全,删除后直接把p赋值为NULL,防止成为野指针。
delete p; p = NULL;
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)!
例子1
#include <iostream> int main() { //不指向NULL,就会成为一个野指针 int* intP = NULL; std::cout << intP << std::endl; //*intP = 10; //错误,指向了NULL,空指针 //分配堆内存 intP = new int; std::cout << intP << std::endl; //分配空间后可以赋值了 *intP = 100; std::cout << *intP << std::endl; delete intP;//删除后,成为野指针,会分配一个地址,但不可以取值和赋值 std::cout << intP << std::endl; //std::cout << *intP << std::endl; //错误,野指针,取值是非法的 intP = NULL;//比较好的做法,删除出指向空指针。 return 0; }
例子2
class Book { protected: int page; float value; public: void printfInfo() { std::cout << "Book page : " << page << std::endl; std::cout << "Book value : " << value << std::endl; } Book(int page, float value) { std::cout << "Book(page, value)" << std::endl; this->page = page; this->value = value; } }; int main() { Book* bookP = new Book(300, 28.0f); std::cout << bookP << std::endl; if (NULL != bookP) { bookP->printfInfo(); delete bookP; bookP = NULL; } std::cout << bookP << std::endl; if (NULL != bookP) { bookP->printfInfo(); } return 0; }
删除后把指针赋值为NULL,就不容易出现访问异常的问题了。
参考文章
© 版权声明