首先我们先来了解一下MFC中的CPtrArray类,他可以说是CObject类型指针对象的集合。通过intAdd( CObject* newElement );注意参数是一个指针类型)可以向集合中添加元素。首先我们定义一个CPtrArray类型的对象。

CPtrArray pArray;//他是一个全局对象

先设定一个举例的类类型。如:

1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    A(int i)
    {
        a = i;
    }
    ~A(){}
public:
    int a;
};

现在我们需要在某个函数中要实现将一个A类型对象数据加入到一个CPtrArray对象中。此函数func1()如下:

1
2
3
4
5
6
7
void func1()
{
    //首先定义一个A类型的对象
    A a(1);
    //使用pArray对象中的成员函数将此对象加入到容器中
    pArray.Add(&a);
}

在另一个函数中我们使用pArray容器为我们保存的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
void func2()
{
    //首先声明一个A类型的对象
    A* a;
    //使用pArray对象中的成员函数GetAt()将A类型的对象取出
    for(int i; i < pArray.GetSize();i++)
    {
        a = (A*)pArray.GetAt(i);
        //使用A中的数据进行相关的操作代码。***此时也可以使用delete释放指针指向的内存区块,防止内存泄露***当然是后面一种方法时才用到,暂时无视之。
        ...
    }
     
}

现在我们发现按照上面的过程,当我们在func2()函数中将要使用pArray容器对象为我们保存的数据时,我们并不能得到想要的数据!!!为什么发生以上情况?图解如下

pArray保存a保存资源的地址;

func1函数执行完成,a发生析构,资源不可用;

原来在func1()函数中,a对象是一个局部对象,当我们使用pArray.Add(&a);我们将a对象的地址保存到pArray对象中。但是作为局部对象,当func1

执行完成后,资源需要回收,此时我们定义的a对象也在A类中的析构函数中被析构释放资源!而当我们在fun2()函数中执行取出保存的对象时,

实际是根据保存的地址去内存中找到数据,虽然此时我们能能够找到此地址,但是这个地址上面的数据并不是我们需要的了!!!所以才发生面的情况!

那么怎么才能解决呢?

看下面,我们只需更改func1函数中的代码:

1
2
3
4
5
6
7
8
void func1()
{
    //首先定义一个A类型的对象
    //A a(1);//为对比,只是注释原来那句
    A* a = new A(1);
    //使用pArray对象中的成员函数将此对象加入到容器中
    pArray.Add(a);
}

这样,我们就能够在func2函数中使用pArray对象中包含的数据了!那么为什么定义了一个指针类型的对象就能够完成了呢?还是一个局部对象呀,

前面说的func1函数执行完成后此对象还是要经历析构的啊!图解如下:

pArray中保存a指向资源的地址;

func1函数执行完成,a对象发生析构,pArray根据地址还能能够访问到之前的资源;

对,是要析构,但是,我们在pArray.Add(a);中加入的是a对象资源的地址,我们先看看A* a = new A(1);在堆中分配资源,我们知道,在堆中分配的资

源是在跟程序的生命周期是一致的。a对象虽然析构了(不存在了),因为a也是一个指针,a指针也就是保存这个资源的地址!我们在pArray中保存

的a的地址出的资源并没有析构!所以在func2函数中我们还能够使用此地址访问此地址对应的资源!

解析C++普通局部变量与指针类型的对象变量的应用区别的更多相关文章

  1. C++类指针类型的成员变量的浅复制与深复制

    本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...

  2. phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别

    [题外话]phpinfo()这个函数可以查看很多php的信息,要 记得使用 phpinfo() 的很多部分有两个Column:Local Value(局部变量)和 Master Value(主变量) ...

  3. 编程范式 epesode7,8 stack存放指针类型and heap,register

    这一节从后往前写. ____stack and heap ___stack由 汇编语言操控管理,数据先入后出. 栈是存放局部变量,函数调用子函数时,该函数在栈中占用的空间会增大,用于存放子函数的局部变 ...

  4. 指针类型(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx 在不安全的上下文中,类型可以是指针类型.值类型或引用类型. 指针类型声明采用下列 ...

  5. C#基础指针类型

    在C#的不安全的代码书写中,类型可以是指针类型.值类型或引用类型. 指针类型声明具有下列形式之一:   type* identifier; void* identifier; //allowed bu ...

  6. C51指针类型和存储区的关系详解

    一.存储类型与存储区关系 data     --->    可寻址片内ram bdata   --->    可位寻址的片内ram idata    --->    可寻址片内ram ...

  7. 3、二、c# 面向对像编程。类,结构、C# 数据类型(引用类型、值 类型、指针类型)、ref参数与out参数、方法的重载、静态类型与静态成员、继承与多态、委托与事件

    一.类 定义类使用class关键字. <access specifier> class class_name { // member variables 成员变量 <access s ...

  8. #运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针

    #运算符:用于在预编译期将宏参数转换为字符串 #define CONVERS(x)  #x   //注:没用双引号包括. 不同类型的指针占用的内存空间大小相同. 局部变量 定义: a[5]; 打印a[ ...

  9. 07深入理解C指针之---指针类型和长度

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 如果考虑到程序的可移植性和跨平台性时,指针长度就是一个问题,需要慎重处理.一般情况下, ...

随机推荐

  1. Microsoft visual studio关闭安全检查

    在用Microsoft visual studio进行代码编写时,使用到列如sprintlf这种比较旧的指令,需要关闭Microsoft visual studio的安全检查: 设置预处理选项:a. ...

  2. FTP:文件传输协议(指令及响应代码)

    文件传输协议(FTP)使得主机间可以共享文件. FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输.控制连接使用类似 TELNET 协议在主机间交换命令 ...

  3. vue-cli创建项目 一直downloading解决办法

    vue-cli创建项目: 1 安装node(需要npm,npm是node的包管理股工具) 2 安装cnpm 3 安装vue-cli       cnpm install vue-cli -g 4 创建 ...

  4. python 中main函数总结

    Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数. 每个文件(模块)都可以任意写一些没有缩进的代码 ...

  5. ECharts使用问题

    Echarts官网上给的例子,在最后有一个分号. 使用ajax请求,在eval()转化时出现错误,原因就是因为多了一个分号

  6. 3-8 & 3-9Unicode 编码

    3-9Unicode 编码 主要支持英文字母和一些特殊字符,中文不支持, 为了支持世界上所有的字符集 就是Unicode编码的出现 char c='\u005d';表示十六进制的. c表示一个尖括号:

  7. 删除多余的OracleOraDb11g_home1TNSListenerLISTENER1

    oracle 监听服务有 OracleOraDb11g_home1TNSListenerLISTENER 和OracleOraDb11g_home1TNSListenerLISTENER1 两个. 用 ...

  8. 怎样使一个INPUT框里的文字在框被点击后自动全选或清除?

    $("#smsContent").focus(function(){ this.select(); }); <input name="keywords" ...

  9. phpstudy的mysql版本升级至5.7

    phpstudy安装的mysql版本一般都是5.5或5.4的,但是有时候做项目又必须用到mysql5.7版本,所以我们现在来看一下如何在phpstudy的环境下将mysql版本升级至5.7 温馨提醒: ...

  10. apache2.4.35 403 forbidden 解决办法