C,C++内存分配

C语言内存分配:

静态内存分配,分配内存大小的是固定,问题:1.很容易超出栈内存的最大值 2.为了防止内存不够用会开辟更多的内存,容易浪费内存

动态内存分配,在程序运行过程中,动态指定需要使用的内存大小,手动释放,释放之后这些内存还可以被重新使用(活水)

1.栈区(stack)

windows下,栈内存分配2M(确定的常数),超出了限制,提示stack overflow错误

自动分配,释放

2.堆区(heap)

在程序运行过程中,可以随意的开辟指定大小的内存,以供使用,相当于Java中的集合

程序员手动分配释放,malloc分配内存,返回指针(p),free(p)释放内存,然后把指针置空。操作系统80%内存

创建一个数组,动态指定数组的大小,返回P指向内存起点。

realloc 重新分配内存

int* p2 = realloc(p, sizeof(int) * (len + addLen));1.原来内存的指针 2.内存扩大之后的总大小,只需要释放P2,P1也就被释放了。

重新分配内存的两种情况:

1.缩小,缩小的那一部分数据会丢失

2.扩大,(连续的)

1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针 2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址 3.如果申请失败,返回NULL,原来的指针仍然有效

3.全局区或静态区

4.字符常量区

5.程序代码区

内存分配的几个注意细节

1.不能多次释放

2.释放完之后(指针仍然有值),给指针置NULL,标志释放完成

3.内存泄露(p重新赋值之后,再free,并没有真正释放内存)

C++动态内存分配

C++ 通过new(delete)动态内存分配
使用C的写法不会调用构造方法,C++写法调用构造方法

class Teacher{
private:
    char* name;
public:
    Teacher(char* name){
        this->name = name;
        cout << "Teacher有参构造函数" << endl;
    }
    ~Teacher(){
        cout << "Teacher析构函数" << endl;
    }
    void setName(char* name){
        this->name = name;
    }
    char* getName(){
        return this->name;
    }
};

void func(){
    //C++   
    //会调用构造和析构函数
    Teacher *t1 = new Teacher("jack");
    cout << t1->getName() << endl;
    //释放
    delete t1;
    //C
    //Teacher *t2 = (Teacher*)malloc(sizeof(Teacher));
    //t2->setName("jack");
    //free(t2);
}

void main(){
    func();
    //数组类型
    //C
    //int *p1 = (int*)malloc(sizeof(int) * 10);
    //p1[0] = 9;
    //free(p1);
    //C++
    int *p2 = new int[10];
    p2[0] = 2;
    //释放数组 []
    delete[] p2;
    system("pause");
}

你可能感兴趣的:(C,C++内存分配)