草庐IT

Destructor

全部标签

c++ - 不提供显式析构函数是不是不好的做法?

如果我没有为C++类提供显式析构函数,因为我确信编译器提供的默认析构函数是我的类所需的全部,这样可以吗?或者这被认为是不好的做法? 最佳答案 提供显式析构函数的主要优点是您可以轻松地将断点放入其中进行调试。有些人喜欢这样,因此更愿意为每个类提供一个显式析构函数。但是,如果类足够简单以至于默认构造函数显然就足够了,那么省略它是完全可以的。另请注意,添加析构函数确实有其缺点:除了代码中的额外噪音外,添加析构函数可能会阻止您的类成为POD。.因此,您仍应避免在整个代码中漫不经心地散布琐碎的析构函数。我认为省略一个空的非虚拟析构函数是有害的

c++ - 多重继承类的复制构造函数

考虑这段代码:#include#includeusingnamespacestd;classBase{char_type;public:Base(chartype):_type(type){}~Base(){coutv;Baseb('b');Childc;v.push_back(b);v.push_back(c);return0;}我系统的输出是:Basedestructor:bChilddestructorBasedestructor:cBasedestructor:bBasedestructor:bBasedestructor:c我的问题是:为什么Base(b类型)的析构函数被调用

c++ - 在哪里放置 ATL COM 对象的析构函数代码?

我在ATLCOM对象中定义的事物的析构函数代码属于哪里?它应该进入~MyComClass()还是MyComClass::FinalRelease()? 最佳答案 只要FinalRelease有问题,我就认为你的问题与ATL有关。在大多数情况下,您可以在两者中的任何一个中清理东西。FinalRelease将在实际析构函数之前立即调用。重要的区别在于,如果您聚合其他对象,FinalRelease让您有机会在顶级COM对象类(尤其是CComObject)的实际析构函数开始工作之前清理引用并释放依赖项。也就是说,您分两步清理内容,首先引用F

c++ - 如果 A 有析构函数,什么时候 std::unique_ptr<A> 需要一个特殊的删除器?

如果类A在unique_ptr它是自己的析构函数,是否有必要声明一个删除器以确保唯一指针使用该析构函数?我想到的例子是A有成员(member)mx类型user_matrix(我刚起的名字)需要调用一个函数free(...)要释放它的内存,可以定义~A(){user_matrix::free(mx);/*etc*/}自default_deleter会调用delete,据我了解应该使用~A().但是,Josuttis(C++标准库:教程和引用)一书的“相关资源的删除器”部分5.2节中打开和关闭目录的示例表明可能需要声明一个特殊的删除器来执行这个,所以我很困惑....这是因为在给定的示例中,

c++ - 在 C++ 中强制最后破坏某些东西

我正在开发一个C++应用程序,它内部有一些定期创建和销毁的Controller对象(使用new)。这些Controller有必要将自己注册到另一个对象(我们称之为controllerSupervisor),并在它们被破坏时注销自己。当我退出应用程序时,我现在面临的问题是:由于销毁顺序不确定,因此单个controllerSupervisor实例在(某些)Controller本身之前被销毁,并且当它们调用在他们的析构函数中注销方法,他们在一个已经被破坏的对象上这样做。到目前为止,我想到的唯一想法(重感冒,所以这可能意义不大)不是将controllerSupervisor作为堆栈上的全局变量

c++ - C++中的delete和调用析构函数有什么区别

如标题所述,这是我的代码:classFoo{public:Foo(intcharSize){str=newchar[charSize];}~Foo(){delete[]str;}private:char*str;};对于这门课,两者之间的区别是什么:intmain(){Foo*foo=newFoo(10);deletefoo;return0;}和intmain(){Foo*foo=newFoo(10);foo->~Foo();return0;} 最佳答案 调用析构函数会释放对象拥有的资源,但不会释放分配给对象本身的内存。第二个代码片

C++ 太多的析构函数调用了这么少的对象

这个问题在这里已经有了答案:Twocallstodestructor(3个答案)关闭8年前。这是代码(也在http://pastebin.com/yw5z2hnG):#include#includeusingnamespacestd;classX{public:inti;X();~X();};X::X(){i=1;cout*vx=newvector;coutpush_back(X());vx->push_back(X());vx->push_back(X());vx->push_back(X());vx->push_back(X());cout我得到的输出是:-------------

c++ - 为什么 C++ std::list::clear() 不调用析构函数?

看这段代码:classtest{public:test(){coutl;l.push_back(DNEWtest());cout然后,看看这个输出:ConstructorDestructorContructor10问题是:为什么在l.clear()处没有调用list元素的析构函数? 最佳答案 你的list是指针。指针没有析构函数。如果你想调用析构函数,你应该尝试list相反。 关于c++-为什么C++std::list::clear()不调用析构函数?,我们在StackOverflow上

c++ - 在 scoped_ptr 出现异常时不调用析构函数

我刚刚开始使用C++boost库。我在很多地方读到,当使用scoped_ptr时,即使出现异常,对象也总是被销毁。Theybehavemuchlikebuilt-inC++pointersexceptthattheyautomaticallydeletetheobjectpointedtoattheappropriatetime.Smartpointersareparticularlyusefulinthefaceofexceptionsastheyensureproperdestructionofdynamicallyallocatedobjects.我尝试了以下代码。#includ

c++ - 默认参数对象何时销毁?

voidfoo(constObject&o=Object()){return;}在上面的函数中,什么时候应该调用~Object?函数何时退出或何时位于调用站点周围的block末尾? 最佳答案 默认参数将在包含函数调用的完整表达式结束时被销毁。 关于c++-默认参数对象何时销毁?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/14309633/