C++ C++;使用新关键字创建obj和直接创建obj有区别吗

C++ C++;使用新关键字创建obj和直接创建obj有区别吗,c++,object,pointers,reference,heap,C++,Object,Pointers,Reference,Heap,我有一个函数,它返回一个指针,就像 Obj * foo() { Obj obj; return &obj; } 上一个函数和下一个函数之间有区别吗 Obj * foo2() { Obj *ptr = new Object(); return ptr; } 是的。第一个在堆栈上创建一个对象并返回其地址。当函数返回时,堆栈展开,对象被销毁。因此,调用者以一个悬空的指针结束 第二个在堆上分配一个对象并返回地址。该对象是有效的,并且将一直有效,直到调用方显式删

我有一个函数,它返回一个指针,就像

Obj * foo()
{
    Obj obj;
    return &obj;
}
上一个函数和下一个函数之间有区别吗

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

是的。第一个在堆栈上创建一个对象并返回其地址。当函数返回时,堆栈展开,对象被销毁。因此,调用者以一个悬空的指针结束

第二个在堆上分配一个对象并返回地址。该对象是有效的,并且将一直有效,直到调用方显式删除它为止


你不应该做第一种方法

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

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

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

@不一样,因为这个问题没有讨论从函数返回地址。真的吗?C++是否调用析构函数,即使我使用了一个指针,如果是这样,那么使用这样的函数是非常危险的。如果可能的话,你能提供一个链接来引用吗?构造函数和破坏与指针无关。创建对象时调用构造函数,销毁对象时调用析构函数。对于堆上的对象,构造函数由
new
调用,析构函数由
delete
操作符调用。谢谢你的回复,我想我明白你的意思了,但是,在指针指向它的时候,C++使一个对象被破坏似乎不合乎逻辑。@ Davut-Ur.ZCAN C++没有垃圾收集的标准化概念。