基本问题:程序何时调用 C++ 中类的析构函数方法?有人告诉我,只要一个对象超出范围或受到某个对象的影响,就会调用它delete
更具体的问题:
1)如果该对象是通过指针创建的,并且该指针后来被删除或被赋予一个新的地址来指向,那么它所指向的对象是否会调用其析构函数(假设没有其他东西指向它)?
2) 继续问题 1,什么定义了对象何时超出范围(不涉及对象何时离开给定的 {block})。那么,换句话说,什么时候对链表中的对象调用析构函数?
3)您是否想手动调用析构函数?
1)如果该对象是通过指针创建的,并且该指针后来被删除或被赋予一个新的地址来指向,那么它所指向的对象是否会调用其析构函数(假设没有其他东西指向它)?
这取决于指针的类型。例如,智能指针在删除对象时常常会删除它们。普通指针则不然。当指针指向不同的对象时也是如此。一些智能指针会销毁旧对象,或者如果它没有更多引用,则会销毁它。普通指针没有这样的智能。它们只是保存一个地址,并允许您通过专门这样做来对它们指向的对象执行操作。
2) 继续问题 1,什么定义了对象何时超出范围(不涉及对象何时离开给定的 {block})。那么,换句话说,什么时候对链表中的对象调用析构函数?
这取决于链表的实现。典型的集合在被销毁时会销毁所有包含的对象。
因此,指针的链表通常会破坏指针,但不会破坏它们指向的对象。 (这可能是正确的。它们可能被其他指针引用。)但是,专门设计用于包含指针的链表可能会在其自身销毁时删除对象。
当指针被删除时,智能指针的链接列表可以自动删除对象,或者如果它们不再有引用,则可以自动删除对象。这一切都取决于你来选择那些能完成你想要的事情的部分。
3)您是否想手动调用析构函数?
当然。一个例子是,如果您想用另一个相同类型的对象替换一个对象,但不想释放内存只是为了再次分配它。您可以就地销毁旧对象并就地构建一个新对象。 (但是,通常这是一个坏主意。)
// pointer is destroyed because it goes out of scope,
// but not the object it pointed to. memory leak
if (1) {
Foo *myfoo = new Foo("foo");
}
// pointer is destroyed because it goes out of scope,
// object it points to is deleted. no memory leak
if(1) {
Foo *myfoo = new Foo("foo");
delete myfoo;
}
// no memory leak, object goes out of scope
if(1) {
Foo myfoo("foo");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)