我不确定这有什么问题(请记住,我有点像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;
}
在编译时,这个编译得很好。但是在运行时它会抛出运行时异常(某种访问冲突)
我做错了什么?
答案 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