Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';在返回的对象上是否调用析构函数? 这样我就可以通过返回指针来返回C++中的对象。但我的印象是,一旦函数完成运行,就会调用所有对象的析构函数。为什么对要返回的对象不调用析构函数?_C++ - Fatal编程技术网

为什么';在返回的对象上是否调用析构函数? 这样我就可以通过返回指针来返回C++中的对象。但我的印象是,一旦函数完成运行,就会调用所有对象的析构函数。为什么对要返回的对象不调用析构函数?

为什么';在返回的对象上是否调用析构函数? 这样我就可以通过返回指针来返回C++中的对象。但我的印象是,一旦函数完成运行,就会调用所有对象的析构函数。为什么对要返回的对象不调用析构函数?,c++,C++,使用new创建的对象的析构函数在删除指针之前不会被调用 为确保不会忘记删除指针,请尝试使用智能指针,如std::shared_ptr或std::unique_ptr 如果您的编译器不够新,无法包含智能指针,您可以从中找到一些。当您返回对对象的引用时,它的作用域不再局限于函数,因此不会随函数一起消失(即指向对象的指针不会被删除)。C++(在.net之外)除非您告诉对象,否则不会删除该对象。只有当您编写的代码不正确时才会发生这种情况。例如: Foo* MyFunction() { Foo f

使用
new
创建的对象的析构函数在
删除
指针之前不会被调用

为确保不会忘记删除指针,请尝试使用智能指针,如
std::shared_ptr
std::unique_ptr


如果您的编译器不够新,无法包含智能指针,您可以从中找到一些。

当您返回对对象的引用时,它的作用域不再局限于函数,因此不会随函数一起消失(即指向对象的指针不会被删除)。

C++(在.net之外)除非您告诉对象,否则不会删除该对象。

只有当您编写的代码不正确时才会发生这种情况。例如:

Foo* MyFunction()
{
    Foo foo(2);
    return &foo;
} // foo is implicitly destroyed as we return
这个坏了。我获取了
foo
的地址,但它也被破坏了,因为它超出了范围。这很好:

Foo* MyFunction()
{
    Foo* j=new Foo(2);
    return j;
} // j is implicitly destroyed as we return

这很好。虽然
j
由于超出范围而被销毁,但我返回的值仍然是我创建的
Foo
的地址。我分配的
foo
不会被销毁,因为它不会超出作用域。

当对象离开其作用域时,仅调用具有自动存储持续时间的对象的析构函数(不只是一个函数,而是任何作用域:大括号、
for
-语句,甚至单行表达式)

另一方面,静态存储持续时间的对象仅在程序退出时销毁,而动态存储持续时间的对象(即使用
new
操作符创建的对象)仅在您请求时手动销毁


当您以描述的方式返回指针时,几乎可以肯定该指针指向一个动态创建的对象,因此指针的接收者有责任确保对象最终被清除。这是裸指针的最大缺点:它们不传递任何隐式的所有权声明,您必须在代码之外手动提供有关谁负责动态对象的信息。

有两种分配对象的方法:堆栈和堆

1) 对象是使用
new
关键字在堆上创建的。这些对象只有在被
delete
d删除后才会被销毁


2) 堆栈上存在其他对象-无
新建
,无
删除
。这些对象超出范围时将被销毁。如果返回指向这些对象之一的指针(通过获取堆栈分配对象的地址,一旦对象超出范围,指针将无效。

您可能需要提及
静态Foo Foo(2);return&foo;
场景。在第二个示例中,为什么foo对象没有超出范围?@badatmath:
foo*
对象(
j
)超出范围(并且由于具有自动存储持续时间而被销毁),但是
new foo(2)
创建的
foo
具有动态存储持续时间(只有当您明确销毁它时(使用
delete
))才会被销毁。由
new Foo(2)
创建的
Foo
从未真正在范围内(它存在于免费商店的以太中),所以它不能超出作用域。@badatmath:什么名称会超出作用域?在函数作用域内创建的唯一名称是
f
@DavidSchwartz:但我认为对象也是在作用域内创建的?或者析构函数只应用于实际声明的变量(与它指向的对象相反,像j)?