• C++入门经典-例5.13-内存安全,被销毁的内存


    1:当指针所指向的内存被销毁时,该区域不可复用。若有指针指向该区域,则需要将该指针置为空值(NULL)或者指向未被销毁的内存。

        内存销毁实质上是系统判定该内存不是变成人员正常使用的空间,系统也回将它们分配给别的任务。若擅自使用被销毁内存的指针更改该内存的数据,很可能会造成意向不到的后果。

    代码实例如下:

    // 5.13.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    int* sum(int a, int b)
    {
        int* pS = NULL;
        int c = a + b;
        pS = &c;
        return pS;
    }
    int main()
    {
        int* pI = NULL;  //将指针初始化为空
        int k1 = 3;
        int k2 = 5;
        pI = sum(k1, k2);
        cout << "*pI的值:" << *pI << endl;
        cout << "也许*pI还保留着i值,但它已经被程序认定为销毁" << endl;
        cout << "*pI的值:" << *pI << endl;
        cout << "尝试修改*pI" << endl;
        *pI = 3;
        for (int i = 0; i<3; i++)
        {
            cout << "修改被销毁的内存后*pI的值:" << *pI << endl;
        }
    }
    View Code

    运行结果:

    2:从上面的程序可以看出,指针pI从sum函数中得到一个临时指针,该指针是指针pS的临时复制品,操作完成后就消失,而它所保留的地址交给了pI。在sum执行完毕后,该域使用的栈内存会被系统销毁或挪用。本程序尝试使用pI继续使用修改它,结果是系统会在此销毁它。在某些场合下,该程序也许会引起内存报错,甚至会造成多个程序崩溃。所以对于栈内存的指针一定要明白其何时被销毁,不在重复利用它。

  • 相关阅读:
    mySQL教程 第1章 数据库设计
    System center virtual machine manager 2008 R2安装部署及实战技术
    cisco ssh配置
    IPv6地址介绍
    远程桌面如何复制本地文件 远程桌面拷贝电脑上的文件方法
    mySQL教程 第2章 准备学习用到的表和数据
    十四个ASP.NET基础知识问答(C#版)
    十四个ASP.NET基础知识问答(C#版)
    关闭框架网页(C#)
    关闭框架网页(C#)
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7526353.html
Copyright © 2020-2023  润新知