我知道我shouldn't从析构函数中抛出异常。如果我的析构函数调用一个可以抛出异常的函数,我可以在析构函数中捕获它并且不再抛出它吗?或者它是否会导致中止,我根本不应该从析构函数中调用此类函数? 最佳答案 是的,这是合法的。异常不能从析构函数中逃逸,但无论在析构函数内部发生什么,或者在它调用的函数中发生什么,都由您决定。(从技术上讲,异常也可以从析构函数调用中逃逸。如果由于抛出另一个异常而在堆栈展开期间发生这种情况,则会调用std::terminate。因此它由标准,但这是一个真的坏主意。)
这里的“简单”是指具有非虚空析构函数或POD类型的类。典型例子:charbuffer[SIZE];T*p=new(buffer)T;...p->~T();//如果我们不在p上调用显式析构函数会怎样?我不认为这是未定义的行为或内存泄漏。重用buffer有什么问题吗? 最佳答案 从技术上讲,假设析构函数不释放在构造期间获取的任何资源,则可能没有必要。但是,考虑到非技术方面——代码的维护和演进——我会坚持最佳实践——构建的东西应该被破坏。要考虑的场景-如果将来某些更改将确定要放入析构函数中的相关代码怎么办?你会记得你怀疑过那种类型的对象的
这是对Whycan'tAlexandrescuusestd::uncaught_exception()toimplementSCOPE_FAILinScopeGuard11?的跟进我想检测是否有人在另一个类的析构函数中创建MyClass(或者在调用堆栈中某处使用事件析构函数)。classMyClass{public:MyClass(){assert(???whattoputhere????);}}voidf(){MyClassm;//whetherthisassertsshouldbecontextdependant}classOtherClass{~OtherClass(){MyCl
我正在编写多线程C++程序。我打算杀死线程。但是,我也在使用引用计数GC。我想知道当线程被终止时,堆栈分配的对象是否会被破坏。 最佳答案 当您“杀死”一个线程时,堆栈不会展开。杀死线程不是一种稳健的操作方式-它们打开的资源(例如文件)在进程关闭之前一直保持打开状态。此外,如果他们在您关闭它们时保持打开任何锁,则该锁可能会保持锁定状态。请记住,您可能会调用很多您无法控制的平台代码,并且您并不总是能看到这些东西。关闭线程的优雅而稳健的方法是中断它-通常它会轮询以查看它是否被告知要定期关闭,或者它是否正在运行消息循环并且您向它发送退出消息
用this参数调用析构函数中的某个函数是否有效?函数不存储指针,而是假定为全功能对象。 最佳答案 this在析构函数中仍然有效。但是,您需要记住,一旦对象被销毁,虚函数就不再像您预期的那样正常工作;参见例如NeverCallVirtualFunctionsduringConstructionorDestruction.本质上,对象的动态类型随着每个析构函数的完成而被修改。 关于c++-在析构函数中使用"this",我们在StackOverflow上找到一个类似的问题:
我想知道用atexit()注册的函数是在全局变量被销毁之前还是之后被调用的。这是由定义的标准或实现指定的吗? 最佳答案 它定义明确,取决于所讨论的对象是在使用atexit()注册函数之前还是之后构建的:3.6.3Termination3.Ifthecompletionoftheinitializationofanobjectwithstaticstoragedurationissequencedbeforeacalltostd::atexit(see,18.5),thecalltothefunctionpassedtostd::at
#include#includestructA:publicstd::enable_shared_from_this{~A(){autothis_ptr=shared_from_this();//std::bad_weak_ptrexceptionhere.std::cout();a.reset();return0;}我在调用shared_from_this()时遇到std::bad_weak_ptr异常。是设计使然吗?是的,这可能很危险,因为在析构函数返回后无法使用此指针,但我看不出为什么在技术上不可能在这里获取指针的原因,因为共享指针对象显然仍然存在并且可以用过的。除了编写我自己的
.vbs中的对象以什么顺序销毁?也就是说,给定这些全局变量:Setx=NewXxxSety=NewYyy我对以下任何的答案感兴趣。对于在.VBS中实现的类的实例,将以什么顺序调用Class_Terminate?粗略的戳按创建的顺序(不是相反的顺序!),但这能保证吗?编辑:我知道Class_Terminate将在对象的最后一个引用被释放时调用。我的意思是:x和y将以什么顺序发布,是否有保证?为简单起见,假设x和y是对其各自对象的唯一引用。对象的类型重要吗?例如如果我在.VBS中实现的类与其他COM对象混合在一起,例如Scripting.FileSystemObject。编辑:我知道COM
我有一个具有特定状态的对象。对象被传递并且它的状态被临时改变。像这样的东西:publicvoiddoSomething(MyObjectobj){obj.saveState();obj.changeState(...);obj.use();obj.loadState();}在C++中,可以在构造和分解时使用对象的范围来运行一些代码,例如NeatManager(MyObjectobj){obj.saveState();}~NeatManager(){obj.loadState();}并称它为voiddoSomething(MyObjectobj){NeatManagermng(obj);
tempfile.NamedTemporaryFile()的描述说:Ifdeleteistrue(thedefault),thefileisdeletedassoonasitisclosed.在某些情况下,这意味着文件在Python解释器结束。例如,在下面运行以下测试时py.test,临时文件保留:from__future__importdivision,print_function,absolute_importimporttempfileimportunittest2asunittestclasscache_tests(unittest.TestCase):defsetUp(sel