【问题标题】:Pointer Initialization in Classes类中的指针初始化
【发布时间】:2011-06-24 09:55:26
【问题描述】:

以下代码有效吗?

class Foo()
{
    int* Bar;

    public:

    Foo()
    {
        *Bar = 123;
    }
}

换句话说,Bar 会在构造函数中为该空间分配值之前实际指向实际内存空间吗?还是我做过这样的事情:

class Foo()
{
    int* Bar;

    public:

    Foo()
    {
        Bar = new int[1];
        *Bar = 123;
    }

    ~Foo()
    {
        delete[] Bar;
    }
}

【问题讨论】:

  • 您是否尝试手动分配内存地址?无论如何,我不是专家,但我相当肯定你从不说“new int”或任何其他原语。
  • 最合适的一个是错误的。你需要更新它。

标签: c++ class pointers constructor


【解决方案1】:

您需要像在第二个示例中那样分配内存。如果您尝试运行第一个示例中的代码,它很可能会因访问冲突错误而崩溃,因为您试图将整数 123 写入未初始化的 Bar 指针的值指向的内存的任何部分.

【讨论】:

    【解决方案2】:

    在第一个例子中 -

    int* Bar;
    

    指针指向一个对象。编译器的工作是为整数指针 Bar 分配内存(即 4 字节)以保存整数变量的地址。但是,必须指定它指向的位置才能取消引用。

    这更像是一家银行给你一个账户。拥有银行账户并不意味着您可以从 ATM 取款。您的帐户应该有足够的钱来提款。如果您没有钱并且在编程范式中行为未定义,则交易失败。因此,您的第一个示例行为是未定义的。如果我的比喻太尴尬,我很抱歉。

    在第二个例子中-

    int* Bar = new int[1] ; // Here [1] is unnecessary as your Bar points to a single integer memory location.
    

    这里,Bar 是一个指针,指向从空闲存储区获得的有效整数位置。所以,Bar 指向的位置可能有垃圾值。因此,在取消引用之前对其进行初始化。即,

    *Bar = 10;
    *Bar *= 10;
    

    在第二个示例中,由于您正在管理资源,因此您有责任将资源返回免费商店。

    【讨论】:

      【解决方案3】:

      如果你不想要动态数组,那么

      Bar = new int;
      *Bar = 123;
      

      够了!然后你必须这样做:

      delete Bar; //not delete[] Bar;
      

      --

      但是,如果您想要动态数组(使用它可以存储多个值),请执行以下操作:

      Bar = new int[5];
      Bar[0] = 123;
      Bar[3] = 788; 
      //etc
      

      那么delete[] Bar才是删除分配内存的正确方法!

      【讨论】:

        【解决方案4】:

        在构造函数中将值分配给该空间之前,Bar 是否会实际指向实际内存空间?

        没有。指针只是一个“简单”的变量。它不会为您分配任何内存。此外,如果您不初始化它,那么它将指向内存中的某个任意且几乎不可预测的位置。

        一般来说,您应该将其初始化为 NULL(或 0,具体取决于偏好)或您已分配的内存(就像使用 Bar = new int 一样)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-08
          • 1970-01-01
          • 2012-02-13
          • 2014-12-03
          • 2011-04-10
          相关资源
          最近更新 更多