面向对象编程中的一种特殊方法,在对象被销毁时调用
为什么 C4265 Visual C++ 警告(虚拟成员函数和无虚拟析构函数)默认关闭?
当类至少有一个虚拟成员函数且没有虚拟析构函数时,Visual C++ 会发出 C4265 警告。 显然,警告是为了检测派生类对象被删除的情况...
我正在构建一个矩阵类。为此,我构建了一个双指针数组。所以我试图为此类 MATRIX 实现析构函数,但删除 [] 未按预期运行 这里是...
我想为 OLED 屏幕应用程序构建一个 GUI。我为每个菜单框架构建了一个类。在每个课程中,我需要循环管理屏幕更新和关键事件。当按下某个键时我
什么合法代码可以触发 C4523“指定多个析构函数”Visual C++ 警告?
根据 MSDN,Visual C++ 可以发出 C4523 警告“class”:指定了多个析构函数。这种情况怎么可能呢? 我尝试了以下方法: 类 类 { 〜类(); 〜班级(我...
C++ - 尝试理解虚函数、虚表以及为什么这个程序会出现段错误
以下程序会导致段错误。 从打印中我看到崩溃之前没有调用 Dtor。 在 gdb 中,我看到每个 Y 对象都包含一个指向其 vtable 的指针。 因此,当尝试删除
默认情况下,析构函数不是虚拟的,这样在不需要时不会造成伤害,这很好。 但在基类派生类场景中,是否有没有虚拟析构函数的用例?...
默认情况下,析构函数不是虚拟的,这样在不需要时不会造成伤害,这很好。 但在基类派生类场景中,是否有没有虚拟析构函数的用例?...
我正在尝试编写一个按合同设计库。 我的一种类型定义为: #包括 #包括 #包括 模板 我正在尝试编写一个合同设计库。 我的一种类型定义为: #include <stdexcept> #include <type_traits> #include <utility> template <typename T, typename Post> class out { public: out(T& param, Post check = {}) : param{param}, copy{param}, //must be copyable; may throw check{std::move(check)} {} ~out() noexcept(false) { if (!check(param)) { param = std::move(copy); //rollback; assume this never throws if (!std::uncaught_exceptions()) //no exception currently being thrown throw std::invalid_argument("postcondition violated"); // leaves destructor if another exception is not being thrown } } private: T& param; T copy; Post check; }; 以下是如何使用它的示例: #include <vector> #include <cassert> struct is_not_empty { bool operator()(const std::vector<int>& v) { return !v.empty(); } /*not real code, just meant to illustrate the problem*/ is_not_empty() { /*acquire some resource*/ } ~is_not_empty() { /*release some resource*/ } /******/ }; void function_with_postcondition(out<std::vector<int>, is_not_empty> v) { } // Exception thrown here in out<>::~out int main() { std::vector<int> v; //empty try { function_with_postcondition(v); assert(false); //not reached } catch (const std::invalid_argument& e) { } } 我的问题 - v 对象是否已在 function_with_postcondition() 中正确销毁? out<>::Post 成员是否被正确销毁? 在这个例子中是否存在资源泄漏?我是否递归调用析构函数? 这是明确定义的吗? 我真正想要了解的是确切发生的操作的(明确定义/未定义)顺序。 我知道堆栈展开,并且我知道在已经抛出异常时抛出异常会导致对 std::terminate() 的调用 - 这就是我在析构函数中调用 std::uncaught_exceptions() 时试图避免的情况。 如果函数抛出异常,我不想检查后置条件,因为函数异常退出。 最后,为什么不采用另一种方式(例如assert()、abort()、exit()等)? 我正在尝试编写一个库来检查在异常环境中稳健的函数前置条件和后置条件。 我正在尝试减少所需的样板数量,同时允许允许重试操作的提交/回滚语义。 引用[除了.ctor] 3 如果对象的析构函数因异常而终止,则执行在执行析构函数主体([class.dtor])之后执行且尚未开始执行的每个析构函数调用。 因此我们保证在展开堆栈之前至少会尝试调用成员和基类的析构函数。只要相关的其他对象表现得相当良好,这一切都很好。如果您使用允许析构函数抛出的其他类型来编写模板,则预计会快速调用 std::terminate。 此外,将类型插入标准库模板时要小心。大多数都会有未定义的行为,即来自所提供的用户类型的析构函数会抛出。
在销毁 TThread 对象之前,通常需要等待调用 TThread.Execute() 方法的线程完成,因为只有这样我们才能确定,例如,对象
CPython:在没有自定义“tp_dealloc”的 C 定义静态类型中使用“tp_finalize”
PEP 442 向 Python 类型定义引入了 tp_finalize 回调(作为 Python 类的 __del__ 函数的一对一等效项),并建议将其用于任何重要的破坏。 ...
在我正在开发的一个库中,其目的是包装 C 建模库,我有一个 EntityBase 类型,它充当其他类(如 Body、Face 等)的基类...: 实体库类 {
C++ 中 std::shared_ptr 和 std::weak_ptr 析构函数调用的意外顺序
问题: 我有一个使用 std::shared_ptr 和 std::weak_ptr 的 C++ 程序,涉及两个类 A 和 B。该程序为这两个类创建共享指针并建立它们之间的关系,...
当基类在析构时需要知道派生类的信息时,如何避免在析构函数中调用虚函数?
目前我遇到以下情况: 我有一个带有 void* V 成员的基类 Base,实际上可能是 A*、B*、C*,并且三个(只有三个,固定数量)类类别将从
当基类在析构时需要知道派生类的信息时,如何避免在析构函数中调用虚函数?
目前我遇到以下情况: 我有一个带有 void* V 成员的基类 Base,实际上可能是 A*、B*、C*,并且类的三个(只有三个,固定数量)类别将从
自从我过去处理过 JavaScript 的时髦“对象模型”以来,我认为不存在析构函数这样的东西。我的搜索不太成功,所以你们是我最后的希望。哈...
`__del__` 和 `__delete__` 有什么区别? [重复]
假设有人不知道 __del__ 和 __delete__ 之间有什么区别?写个解释吧。
为什么在从 Thread 子类的析构函数中调用 super 的析构函数时,会出现“AttributeError: 'super' object has no attribute '__del__'”?
在我的Python(3.6)程序中,我有一个线程对象,如下所示: 类 MyThread(threading.Thread): def __init__(自身): super(MyThread, self).__init__() ... def __del__(自我): ...
我对 C++ 很陌生,我正在开发应用程序,我通过使用像 MyObject* obj = new Object() 这样的 new 关键字在内存中分配很多对象。与他们进行一些操作后(一些...
我试图找出terminate()、exit()和abort()之间的区别,以及微软的 我的 Google 搜索中出现了 C++ 程序终止文档,该文档比较了退出、中止和...