C ++使用new关键字创建obj和直接创建是否有区别

时间:2014-03-12 12:31:07

标签: c++ object pointers reference heap

我有函数返回一个像;

的指针
Obj * foo()
{
    Obj obj;
    return &obj;
}

上一个功能和下一个功能之间是否存在差异

Obj * foo2()
{
    Obj *ptr = new Object();
    return ptr;
}

3 个答案:

答案 0 :(得分:2)

是的,确实如此。第一个在堆栈上创建一个对象并返回其地址。当函数返回时,堆栈展开并且对象被销毁。因此调用者最终会有一个悬空指针。

第二个在堆上分配一个对象并返回该地址。该对象是有效的,并且将继续如此,直到调用者明确删除它为止。

你永远不应该采取第一种方法!

答案 1 :(得分:2)

在第一个版本中,您将返回一个悬空指针。您应该按值返回:

Obj foo()
{
    Obj obj;
    return obj;
}

答案 2 :(得分:0)

第一个功能不正确。您将返回指向本地对象的指针,但是当函数返回时,所有本地对象都将被销毁。