类中的指针初始化

时间:2011-02-09 20:19:46

标签: c++ class pointers constructor

以下代码是否有效?

class Foo()
{
    int* Bar;

    public:

    Foo()
    {
        *Bar = 123;
    }
}

换句话说,在构造函数中将值赋给该空间之前,Bar是否会实际指向实际内存空间?或者我做过这样的事情:

class Foo()
{
    int* Bar;

    public:

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

Bar = new int;
*Bar = 123;

就够了!然后你要做到这一点:

delete Bar; //not delete[] Bar;

-

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

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

然后delete[] Bar是删除已分配内存的正确方法!

答案 2 :(得分:1)

  

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

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

一般来说,您应该将其初始化为NULL(或根据偏好设置为0),或者将其初始化为您已分配的内存(就像使用Bar = new int一样)。

答案 3 :(得分:1)

在第一个例子中 -

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;

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