为什么';在返回的对象上是否调用析构函数? 这样我就可以通过返回指针来返回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)?