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 = ;
int k2 = ;
pI = sum(k1, k2);
cout << "*pI的值:" << *pI << endl;
cout << "也许*pI还保留着i值,但它已经被程序认定为销毁" << endl;
cout << "*pI的值:" << *pI << endl;
cout << "尝试修改*pI" << endl;
*pI = ;
for (int i = ; i<; i++)
{
cout << "修改被销毁的内存后*pI的值:" << *pI << endl;
}
}

运行结果:

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

C++入门经典-例5.13-内存安全,被销毁的内存的更多相关文章

  1. C++入门经典-例5.15-回收动态内存的一般处理步骤

    1:正确的步骤应该是如下代码所示: // 5.15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostrea ...

  2. C++入门经典-例5.12-动态内存的销毁

    1:当申请一块堆内存后,系统不会再程序执行时一句情况自动销毁它.若想释放该内存,则需要使用delete关键字.下面的代码中,可以看出堆和栈的不同.代码如下: // 5.12.cpp : 定义控制台应用 ...

  3. C++入门经典-例5.19-指针的引用与传递参数

    1:引用传递参数与指针传递参数能达到同样的目的.指针传递参数也属于一种值传递,其传递的是指针变量的副本.如果使用指针的引用,就可以达到在函数体内改变指针地址的目的.运行代码如下: // 5.19.cp ...

  4. C++入门经典-例5.14-丢失的内存,关于内存泄漏

    1:代码如下: // 5.14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  5. C++入门经典-例6.18-数组的动态分配,动态获得斐波那契数列

    1:有时在获得一定的信息之前,我们并不确定数组的大小.动态分配数组则可以使用变量作为数组的大小,使数组的大小符合我们的要求. 2:科普一下斐波纳契数列:斐波那契数列指的是这样一个数列 1, 1, 2, ...

  6. C++入门经典-例6.13-指针与二维数组

    1:代码如下: // 6.13.cpp : 定义控制台应用程序的入口点. // #include"stdafx.h" #include<iostream> using ...

  7. C++入门经典-例8.2-构造函数的访问顺序

    1:父类和子类中都有构造函数和析构函数,那么子类对象在创建时是父类先进行构造还是子类先进行构造?同样,在子类对象释放时,是父类先进行释放,还是子类先进行释放?这都是有先后顺序的.答案是当从父类派生一个 ...

  8. C++入门经典-例7.10-运算符的重载,重载加号运算符

    1:曾经介绍过string类型的数据,它是C++标准模版库提供的一个类.string类支持使用加号“+”连接两个string对象.但是使用两个string对象相减确实非法的,其中的原理就是C++所提供 ...

  9. C++入门经典-例7.8-const对象,标准尺寸

    1:当建立一个对象之后,如果不希望它的任何数据发生改变,可以将其直接声明为const对象,例如: const 类名 对象名 const对象必须初始化.我们可以调用它的数据和函数,但是不可以对他们进行修 ...

随机推荐

  1. sql server SQL 服务器 - RDBMS

    SQL 服务器 - RDBMS --现代的 SQL 服务器构建在 RDBMS 之上. DBMS - 数据库管理系统(Database Management System) --数据库管理系统是一种可以 ...

  2. VS 2005 \ 2008 "当前不会命中断点。源代码与原始版本不同"解决方法

    全选CPP文件内容, 选择 “编辑”-“高级”-“设置选定内容的格式”,保存,重新编译! 快捷键 ctrl + A 全选文件内容后 按 ctrl + K ,F OK!

  3. 用java语言(文件和文件流知识点)实现图片的拷贝,从d盘拷贝到e盘

    /** * 实现图片的拷贝\ * 注意:用的是文件字节流 */ package com.test4; import java.io.*; public class Demo12_4 { /** * @ ...

  4. weex 轮播如何使用?

    下面的内容是你必须要掌握的 1.怎么让banner的宽度和屏幕的宽度相等 2.怎么让banner自动轮播和轮播间隔 3.如何添加指示器 4.如何设置指示器的颜色和大小 5.点击轮播图时触发事件 6.检 ...

  5. nginx redirect ignore port 两层nginx跳转忽略了端口

    问题: 两层nginx做代理,第一层:nginx:将9087->代理到80端口,第二层:将80端口->流量打到我们的代码上,结果在代码中拿到的链接不带9087端口,则代码中发生跳转的时候, ...

  6. 安装vim自动补全插件

    1 安装VIM 2 安装vim插件管理工具.过程见链接.(谢谢) 3 在.vimrc中添加下列代码 Bundle 'Valloric/YouCompleteMe' 保存退出后打开vim,在正常模式下输 ...

  7. fiddler4自动生成jmeter脚本

    接口.性能测试任务当遇到从浏览器或移动app自己抓包的情况出现时就变得巨苦逼了,苦在哪里?苦在需要通过抓包工具抓报文,需要通过抓包报文梳理业务逻辑.需要将梳理的逻辑编写成脚本.最最苦的情况是,自己抓包 ...

  8. dcoker_ubuntu中安装python2.7

    1.apt-get update 2.apt-get install python2.7 或 1.sudo apt-get update 2.sudo apt-get install python2. ...

  9. 树形DP Choosing Capital for Treeland

    给你一棵有向树,需要选定一个点为capital,满足翻转边数最小 思路:先求出1为capital 的答案,然后向下更新孩子节点 dp[i]=dp[i-1]+judge(i); #include< ...

  10. Spring MVC HandlerMapping

    http://www.cnblogs.com/tengyunhao/p/7658952.html http://www.cnblogs.com/tengyunhao/p/7518481.html Sp ...