Tag: 析构函数

析构函数C ++中的exception

我很清楚,不应该在析构函数中抛出任何exception。 但是作为抓住这个概念的一部分,我编码了这个例子: #include <iostream> using namespace std; class A { private: int i; public: A() { i = 10; } ~A() { throw 30; } }; int main(){ try{ A(); throw 10; } catch (int i){ cout << i << endl; cout << "exception caught" << endl; } } 根据我的理解,这个程序应该通过调用std :: terminate()来终止,因为同时会有两个exception。 但是,这个程序是给出以下输出: 30 exception […]

静态终结器

什么是正确的方式来执行一些静态finallization? 没有静态析构函数。 AppDomain.DomainUnload事件不在默认域中引发。 AppDomain.ProcessExit事件共享所有事件处理程序之间三秒(默认设置)的总时间,所以它不是真的可用。

前向声明与unique_ptr?

我发现使用类的前向声明与std::unique_ptr结合使用是很有用的,如下面的代码所示。 它编译和GCC工作,但整个事情似乎有点奇怪,我不知道这是标准的行为(即标准所要求的)? 因为当我声明unique_ptr时B不是一个完整的types。 A.hpp #include <memory> class B; class A { std::unique_ptr<B> myptr; // B::~B() can't be seen from here public: ~A(); }; A.cpp #include "B.hpp" //B.hpp has to be included, otherwise it doesn't work. A::~A() = default; // without this line, it won't compile // however, any destructor definiton will do. 我怀疑这与析构函数有关(因此需要调用unique_ptr<B>的析构函数)是在特定的编译单元(A.cpp)中定义的。

你如何查询一个pthread,看看它是否仍在运行?

在我的析构函数中,我想干净地破坏一个线程。 我的目标是等待一个线程完成执行,然后破坏线程。 我发现查询pthread的唯一情况是pthread_attr_setdetachstate,但是这只能告诉你,如果你的线程是: PTHREAD_CREATE_DETACHED PTHREAD_CREATE_JOINABLE 这两者与线程是否仍在运行无关。 你如何查询一个pthread,看看它是否仍在运行?

转到一个块:做析构函数被调用?

考虑下面的代码: void foo() { { CSomeClass bar; // Some code here… goto label; // and here… } label: // and here… } 酒吧的析构者会被调用吗?

可以自动生成默认析构函数作为虚拟析构函数吗?

可以自动生成默认析构函数作为虚拟析构函数吗? 如果我定义一个基类,但没有默认的析构函数,是否有一个默认的虚析构函数自动生成?

析构函数的使用=删除;

考虑以下课程: struct S { ~S() = delete; }; 不久,为了这个问题的目的:我不能像S s{};那样创buildS s{};实例S s{}; 因为我不能摧毁他们。 正如在评论中提到的,我仍然可以通过执行S *s = new S;来创build一个实例S *s = new S; ,但我不能删除它。 因此,我可以看到一个删除析构函数的唯一用法是这样的: struct S { ~S() = delete; static void f() { } }; int main() { S::f(); } 也就是说,定义一个仅暴露一堆静态函数的类,并禁止任何尝试创build该类的实例。 删除析构函数的其他用途(如果有的话)是什么?

在什么情况下C ++析构函数不会被调用?

我知道我的析构函数是在堆栈的正常展开和引发exception时调用的,而不是在调用exit()时调用的。 有没有其他的情况下,我的析构函数不会被调用? 信号如SIGINT或SIGSEGV怎么样? 我认为对于SIGSEGV来说,它们不会被调用,但是对于SIGNINT来说,我怎样才能知道哪些信号会将栈放开呢? 有没有其他的情况下,他们不会被叫?

带有return的C ++析构函数

在C ++中,如果我们定义一个类的析构函数为: ~Foo(){ return; } 一旦调用这个析构函数, Foo的对象就会被销毁,或者从析构函数中显式返回,这意味着我们永远不会想要销毁它。 我想这样做只有通过另一个对象析构函数才能销毁某个对象,也就是说只有当另一个对象准备销毁时才能销毁它。 例: class Class1{ … Class2* myClass2; … }; Class1::~Class1(){ myClass2->status = FINISHED; delete myClass2; } Class2::~Class2(){ if (status != FINISHED) return; } 我在网上search,似乎无法find我的问题的答案。 我也尝试通过一些代码一步一步地debugging,但不能得出一个结论性的结果。

时间复杂度删除运营商

什么是delete[]运算符的时间复杂性 ? 我的意思是它是如何实现的 – 是否遍历数组中的所有元素并调用每个元素的析构函数? 这个操作符是否对原始types ( int等)和用户定义的types做同样的事情?