【问题标题】:C++ de-referencing between pointer指针之间的 C++ 取消引用
【发布时间】:2011-11-24 05:48:32
【问题描述】:

假设我有一个班级 Foo

class Foo {
}

我做以下任务:

Foo *ptrFoo=new Foo();

Foo &ref=*(ptrFoo);  //question 1
Foo afoo=*(ptrFoo); //quesion 2

我的问题:

1) 当分配给“&ref”时,内存方面会发生什么内部情况? 是否只是将“ptrFoo”的内存地址分配给“ref”?

2) 分配给“afoo”时,发生了什么?它是否调用了复制构造函数?这意味着为两个 Foo 对象分配了内存?即“afoo”和之前为“ptrFoo”分配的内存?

3) 假设我有一个名为“void methodBar(const Foo &instance)”的方法 如果我将“ptrFoo”传递为:

methodBar((*preFoo));

这里的“const”有什么意义?

【问题讨论】:

    标签: c++ pointers memory-management


    【解决方案1】:

    1) 当分配给“&ref”时,内存方面会发生什么内部情况?是否只是将“ptrFoo”的内存地址分配给“ref”?

    这取决于您的平台、编译器和编译器设置。您的编译器可能只是为取消引用生成同义词。因为引用可能不会被重新定义,所以编译器没有理由真正需要为变量分配任何内存。

    2) 分配给“afoo”时,发生了什么?它是否调用了复制构造函数?这意味着为两个 Foo 对象分配了内存?即“afoo”和之前为“ptrFoo”分配的内存?

    是的,存储在动态存储中的Foo 的内容被复制(使用复制构造函数)到自动存储中Foo 的实例。不过,这里没有动态分配; aFoo 实例将被创建,就像没有分配一样简单。例如,Foo aFoo;

    3) 假设我有一个名为“void methodBar(const Foo &instance)”的方法,如果我将“ptrFoo”传递为: 方法条((*preFoo)); 这里的“const”有什么意义?

    const 在那个位置意味着当项目通过引用传递时,声明引用const 的方法不允许修改引用引用的实例。

    【讨论】:

      【解决方案2】:
      1. 在执行Foo& ref = *ptrFoo; 时,您正在引用*ptrFoo。此时仅存在一个Foo。您对ref*ptrFoo 所做的任何更改都会影响同一个对象。

      2. 当您执行Foo afoo = *ptrFoo;(与Foo afoo = ref; 相同)时,您将创建另一个单独的 Foo,它独立于*ptrFoo 存在。它由Foo 的复制构造函数初始化。请注意,afoo 存在于堆栈上,但*ptrFoo 存在于空闲存储(堆)上。您对*ptrFoo 所做的任何更改都不会影响afoo反之亦然。另请注意,afoo 将被销毁并在超出范围时自动释放其内存,但 *ptrFoo 必须通过 delete ptrFoo; 显式销毁并释放其内存

      3. 在这种情况下,const 表示该函数接受对它承诺不会修改的Foo 的引用。它不能在该Foo 上调用任何未标记为const 的方法。另外,当你调用这个函数时,不会创建新的Foo(即不是按值传递的)。

      【讨论】:

        【解决方案3】:

        1) 它正在创建对 ptrFoo 指向的对象的引用,没有创建新对象。

        2) 复制构造函数被调用,它正在创建一个 Foo 类型的新对象。

        3) const 表示您正在传递对不应修改其数据的对象的引用。

        【讨论】:

          【解决方案4】:

          1) 分配*(ptrFoo)返回的对象的内存地址,相当于ptrFoo

          2) 复制构造函数被调用。您现在有两个对象,一个分配在堆上并由ptrFoo 指向,另一个分配在堆栈上并命名为afoo

          3) const 表示方法methodBar 不能修改名为instanceFoo& 引用的对象。仅允许调用Foo 上也标记为const 的方法。

          【讨论】:

            猜你喜欢
            • 2019-05-20
            • 1970-01-01
            • 1970-01-01
            • 2011-06-17
            • 1970-01-01
            • 2018-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多