使用未初始化的指针作为函数参数

时间:2011-05-05 10:16:17

标签: c++ pointers pass-by-reference

由于我想将未初始化的指针传递给函数,因此会出现运行时错误。 但如果我将此指针作为参考传递,它就可以正常工作。我无法解释为什么......

class Body
{

};

void check(Body* b)
{
    b = new Body();
}

void checkRef(Body* &b)
{
    b = new Body();
}

int main001()
{
    Body* b;

    //check(b);// error: The variable 'b' is being used without being initialized. (in VS2010)
    checkRef(b); // OK


    return 0;
}

b传递给check和checkRef的区别是什么?我在VisualStudio2010中遇到运行时错误。错误:正在使用变量'b'而未初始化。

编辑:这是VS2010调试输出。发布版本中未出现“错误”

4 个答案:

答案 0 :(得分:7)

为了与checkRef版本等效,您的check函数应为:

void check(Body** b)
{
    *b = new Body();
}

并称为

check(&b);

如果你没有像check(b)那样传递地址,那么你传递的指针b的当前确实是未初始化的。< / p>

答案 1 :(得分:2)

Body * &b中,b是bmain的别名/引用 - 因此,当您为其分配时,您需要修改b中的mainBody* b中的b b是mainb本地副本,您正在修改此本地副本,而不是main中的b 1}}。

您的运行时错误可能是因为main中使用了未初始化的b

编辑:您获得的实际错误是编译器嵌入到代码中的额外检查典型问题机制。它会检测到您通过值传递未初始化的内容,这是没有意义的,因此会生成此错误。

如果您停用此行为,应用程序似乎会正常运行,直到您尝试取消引用main中未初始化的{{1}}

答案 2 :(得分:2)

Body* b并未将b指向任何明智的事物。所以它可能指向一些可能导致地球移位的随机位置。

传递它来检查(通过指针的值)不会以任何方式初始化

void check(Body* b)
{
    b = new Body();
}

如果你通过指针传给它指针,它应该没问题

  void check(Body** b)
  {
     *b = new Body();
  }

和电话

check(&b);

使用您提供的参考示例以C ++方式更好地完成,因为它更新了引用的指针值以指向新分配的Body

答案 3 :(得分:0)

我不知道你为什么会看到运行时错误;我最多会收到编译时警告/错误。但你可以通过将b初始化为NULL来修复它(但这不会修复你的程序;见下文......)

第一个和第二个函数调用之间的区别在于第一个函数调用会导致内存泄漏。您正在传递指针 by-value ,因此在check()内部,您正在使用该指针的副本。您分配此副本,但这不会影响main()中指针的值,因此当您离开该函数时,无法访问new获取的内存。