前言

C语言C++指针很多都一样,但也有不一样的,比如给指针动态内存分配的方式,C语言的看《C语言之指针》和《C语言中的malloc、calloc和free函数的使用》。

下面简单记录一下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,就不容易出现访问异常的问题了。

参考文章

相关文章

暂无评论

none
暂无评论...