• 内存管理


       

    扩展阅读

    内存的三种分配方式:

    1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。

    2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。

    3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。

     

    常见内存错误及对策

    1. 内存分配未成功,却被使用。

    对策:使用内存之前检查是否分配成功。用p!=NULL判断。

    2. 内存分配成功,未初始化就被使用。

    内存的缺省值没有统一的标准。大部分编译器以0作为初始值,但不完全是。

    对策:内存初始化时赋初值。

    3. 内存操作越界。

    对策:只能是小心了。

    4. 释放了内存,仍然使用。

    (1)       使用显示delete和free的野指针。

    对策:释放完内存,将指针置为NULL。

    (2)       使用隐式delete和free的野指针。主要是指函数返回指向栈内存的指针或引用。

    对策:当然是不要返回就可以了。

    5. 未释放内存,导致内存泄露。

    用new/malloc开辟了内存,没用delete/free释放.

    对策:new和delete的个数一定相同;malloc和free的个数一定相同;new[]和[]delete一定对应。


    示例1:返回指向栈空间的指针

     1char* test1()
     2{
     3    char str[] = "Hello World!";
     4    return str;
     5}

     6
     7char* test2()
     8{
     9    char *str = "Hello World!";
    10    return str;
    11}

    12
    13char* test3()
    14{
    15    static char str[] = "Hello World!";
    16    return str;
    17}

    18
    19void main()
    20{
    21    char *str = NULL;
    22    
    23        str = test1(); 
    24    cout << str << endl; //垃圾信息
    25    
    26    str = test2(); 
    27    cout << str << endl; //ok
    28    //str[1] = 'A' ; //error.试图修改常字符串
    29         //str = NULL; //error.试图修改常字符串
    30
    31    str = test3();
    32    cout << str << endl;
    33}

    34

     

    输出结果:
    乱码

    Hello World!

    Hello World!

    示例2:newdelete虽然对应,但delete释放不成功

    void main()
    {
        
    char* p = new char[4];

        p 
    = "ppp";

        delete []p;
    }

    运行时错误。P虽然是动态开辟的内存,但在第二条语句后p已经指向了静态存储区上的地址,而对指向静态存储区的指针是不能用delete释放的。此时不仅运行时错误,还有内存泄露。



    幸运草 2010-06-05 09:34 发表评论
  • 相关阅读:
    java大数取余
    hdu--5351--MZL's Border
    NYOJ--水池数目
    NYOJ--32--SEARCH--组合数
    NYOJ--20--搜索(dfs)--吝啬的国度
    hdu--4148--Length of S(n)
    hdu--2098--分拆素数和
    hdu--1873--看病要排队
    hdu--1870--愚人节的礼物
    hdu--1237--简单计算器
  • 原文地址:https://www.cnblogs.com/liyuxia713/p/2540787.html
Copyright © 2020-2023  润新知