从函数返回类指针

时间:2009-04-21 17:02:32

标签: c++

我不确定这有什么问题(请记住,我有点像C ++的新手)

我有这堂课:

Foo
{
  string name;
  public:
     SetName(string);
}
string Foo::SetName(string name)
{
  this->name = name;
  return this->name;
};
//////////////////////////////////////////////
//This  is where I am trying to return a Foo pointer from this global function:

Foo * ReturnFooPointer()
{
  Foo foo;
  Foo * foo_ptr;
  foo_ptr = &foo;
  return foo_ptr;
}

在编译时,这个编译得很好。但是在运行时它会抛出运行时异常(某种访问冲突)

我做错了什么?

3 个答案:

答案 0 :(得分:24)

您需要使用new关键字在堆上创建新的Foo 当函数结束时,将释放堆栈上的对象,因此您将返回指向内存中无效位置的指针。

这是正确的代码。

Foo * ReturnFooPointer()
{
  Foo * foo_ptr = new Foo();
  return foo_ptr;
}

请记住稍后删除要返回的指针。

稍后在代码中:

Foo *pFoo = ReturnFooPointer();
//Use pFoo
//...
delete pFoo;

答案 1 :(得分:6)

您正在返回指向堆栈上本地对象的指针。它在函数返回时超出范围,并且无效。

您应该创建一个要返回的新实例,即

Foo* foo_ptr = new Foo();

这将在堆中创建一个对象,直到你在其上调用delete为止。

答案 2 :(得分:2)

实际对象在堆栈上分配,因此当它超出范围时(函数返回时)会被销毁。如果你在堆上分配它(使用new),它将一直存在,直到你delete