美文网首页
C,C++内存分配

C,C++内存分配

作者: 潇洒人生_cca2 | 来源:发表于2020-04-05 10:37 被阅读0次

    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++内存分配

          本文链接:https://www.haomeiwen.com/subject/yhqqdctx.html