以下代码是否有效?
class Foo()
{
int* Bar;
public:
Foo()
{
*Bar = 123;
}
}
换句话说,在构造函数中将值赋给该空间之前,Bar
是否会实际指向实际内存空间?或者我做过这样的事情:
class Foo()
{
int* Bar;
public:
Foo()
{
Bar = new int[1];
*Bar = 123;
}
~Foo()
{
delete[] Bar;
}
}
答案 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;
在第二个示例中,由于您正在管理资源,因此您有责任将源返回到免费商店。