【问题标题】:Allocating memory with This pointer用这个指针分配内存
【发布时间】:2014-01-04 03:16:02
【问题描述】:

我需要一些帮助来理解我用来学习 C++ 的书中的代码。

Class Fish
{
public:
    virtual Fish* Clone() = 0; //pure virtual function
};

Class Tuna: public Fish
{
public:
    Tuna* Clone() //virtual clone function
    {
        return new Tuna(*this);
    }
};

该部分实际上是在寻找一种方法来绕过 C++ 中不存在的虚拟复制构造函数。但是,我只是无法将自己的想法包裹在

return new Tuna(*this);

声明。顺便说一句,我了解以下代码。

int* ptr;
ptr = new int[6];

这会将一个 6 个 int 的块分配给一个指针。

 new Tuna();

只会分配一个指针,指向一个有足够空间容纳来自第一个代码 sn-p 的类 Tuna 的位置。然而,This 指针的取消引用是什么意思? This指针指向的对象对吗?那么释放它会揭示对象内存位置的内容吗?这如何联系到

new int[6];

new Tuna(*this);

【问题讨论】:

  • 发布 Tuna 的构造函数
  • 顺便说一句,对于 new int[6],不要忘记删除 [] 它,而不是 new Tuna(),它只是一个删除 tunaPtr(即不带括号)。

标签: c++ class memory this


【解决方案1】:

Tuna 有一个复制构造函数,即使它是编译定义的。

您正在动态分配一个新的Tuna 实例,方法是传递对当前实例的引用并从中复制

    new Tuna(*this);
//   ^    ^    ^
//   |    | ref to current
//   |    |  instance as
//   |    |    argument
//   |    | 
//   | copy ctor
//   |   plz!
//  dynamic
// allocation

被调用的复制构造函数如下所示:

Tuna(const Tuna& other);

*this 给你一个左值 代表当前Tuna,它很高兴地绑定到这个引用参数。

简而言之,这个表达式完全符合函数名称的含义:它克隆当前对象。

它是以下声明的动态分配等效项:

Tuna gimmeMoreTuna(*this);

坦率地说,new int[6] 几乎与此无关。


new Tuna(); 只会分配一个指针,指向一个位置,该位置有足够的空间来容纳来自第一个代码 sn-p 的类 Tuna

不,它也调用默认的Tuna 构造函数。这几乎就是你所缺少的。

【讨论】:

    【解决方案2】:
    new Tuna(*this);
    

    这与调用Tuna 的复制构造函数通过引用传递变量相同。您需要记住,如果您不提供复制构造函数,编译器会自动为您提供一个。像这样的东西; Tuna(const Tuna& var)。因此,在这种情况下,取消引用 this 指针会将它作为参数引用的实例传递给刚刚通过调用 new 分配的实例的复制构造函数。

    您可以将new int[6] 视为调用int 类的默认构造函数6 次并将它们分配到连续的内存位置。

    【讨论】:

      【解决方案3】:

      默认情况下,C++ 将复制构造函数添加到类。所以

      new Tuna(*this)
      

      表示分配Tuna的内存并将其内容复制到“新”Tuna。解除分配这个不会影响“新”Tuna,除非在 Tuna 的类中有 ptr,例如

      class Tuna 
      {
          int* someArray;
          public Tuna()
          {
              someArray = new int[16];
          }
      }
      

      在这种情况下,你需要自己定义复制构造函数来复制数组的内容(这里是 someArray)。

      【讨论】:

        猜你喜欢
        • 2021-06-22
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 2022-09-24
        • 1970-01-01
        相关资源
        最近更新 更多