草庐IT

c++ - 单例的析构函数

问题:我是否应该为具有程序作用域的单例编写析构函数(程序启动时活跃,程序结束时死亡)详细信息:我在一个问题上进退两难“我应该为单例类编写析构函数吗?”1)这个类有程序作用域2)类在堆上使用大量内存,因此释放需要时间当用户退出程序时,响应应该很快,那么为什么要花时间释放这个单例占用的内存,因为内存将在程序结束时释放。 最佳答案 如果释放内存需要很长时间,那就不要做。这可能是一个大而耗时的问题,尤其是在释放内存导致大量缓存未命中的情况下。操作系统将完成这项工作(当然,如果您在实际执行该工作的系统上运行)。但是,如果您的析构函数对某些资源

C++中类的6个默认成员函数【构造函数】 &&【析构函数】

文章目录前言构造函数构造函数的概念构造函数的特性析构函数前言在学习C++我们必须要掌握的6个默认成员函数,接下来本文讲解2个默认成员函数构造函数如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。classDate{};构造函数的概念首先我们看下面的代码来引入一下构造函数classDate{public: voidInit(intyear,intmonth,intday) { _year=year; _month=month; _day=

c++ - 应该在无指针类中声明/实现析构函数吗?

应该在无指针类中声明/实现析构函数吗?有/没有它有什么好处吗?我的男人是:classPoint{public:intX,Y;Point(intx,inty);//~Point(void);//shouldIuncomentitandimplementemptydestructor?} 最佳答案 Shoulddestructiorbedeclared/implementedinpointerlessclass?不需要[条件适用]。编译器会为你生成一个。只有当你想执行一些特定的事情时,你才应该提供一个,而编译器不会。例如:资源管理(内存

c++ - 主动调用析构函数

在这篇文章中:C++Pointer:changingthecontentswithoutchangingtheaddress?用户EricPostpischil提出了一个他主动调用类的析构函数的答案。合法吗?它被认为是好的编程吗?我问的原因是,在我的一节课上,我的老师说这是被禁止的,我们永远不应该这样做,他错了吗?帖子中的问题和答案本身,虽然很有趣,但与我的问题并没有真正相关。 最佳答案 好吧,就像动态对象的创建过程可以“拆解”成两个阶段:原始内存分配和实际初始化(例如通过placement-new调用构造函数)一样,动态对象的销毁

c++ - 调用了错误的析构函数

我对析构函数有理解上的问题。在下面的例子中:#includeusingnamespacestd;classX{public:intid;X(intid){this->id=id;}~X(){cout我得到以下输出:destroying2这对我来说完全出乎意料,因为我认为析构函数总是在对象停止存在时被调用。但在这个例子中,对象1不再存在并被对象2取代。但不是调用对象1的析构函数,而是调用对象2的析构函数。谁能解释一下? 最佳答案 在您的情况下,只有一个对象被销毁-即您分配右侧的临时X(2)。原始的X(1)不会被破坏,因为它被赋值覆盖了

c++ - 析构函数 vs 成员函数再次竞赛

我已经看到类似的问题:Destructorvsmemberfunctionrace..但没有找到以下答案。假设我们有一个拥有一些工作线程的类。类的析构函数看起来像:~OurClass{ask_the_thread_to_terminate;wait_for_the_thread_to_terminate;....do_other_things;}问题是:我们是否可以在工作线程中调用OurClass的成员函数,因为我们确信所有这些调用都将在析构函数中do_other_things之前完成? 最佳答案 是的,你可以。成员变量的销毁只会在

c++ - std::current_exception 是否应该从类的析构函数中的 catch block 返回非空

我和我的同事认为我们在VisualC++2012和2013中发现了一个错误,但我们不确定。以下代码中对std::current_exception的调用是否应该返回一个非空的exception_ptr?似乎在我们尝试过的大多数其他编译器上:#include#include#includeclassA{public:~A(){try{throwstd::runtime_error("ohno");}catch(std::exception&){std::clog在VisualC++下运行时,我们得到“0”(假,这意味着返回的exception_ptr为空)。其他编译器,例如g++,打印“

c++ - 为什么在 Singleton 类中使用私有(private)析构函数?

我已经看到构造函数、复制构造函数、析构函数和赋值运算符保存在典型的单例类中的私有(private)范围内。例如classCMySingleton{public:staticCMySingleton&Instance(){staticCMySingletonsingleton;returnsingleton;}private:CMySingleton(){}//Privateconstructor~CMySingleton(){}CMySingleton(constCMySingleton&);//Preventcopy-constructionCMySingleton&operator

C++ Stack-allocated 对象赋值和析构函数调用

我试图理解在为堆栈上分配的对象分配新值时出现的奇怪行为(对于同一数据集,析构函数被调用两次)。我将从代码片段及其输出开始:classFoo{public:Foo(conststring&name):m_name(name){log("constructor");}~Foo(){log("destructor");}voidhello(){log("hello");}private:stringm_name;voidlog(conststring&msg){cout输出:Foo.0x7fff58c66a58[f1]constructorFoo.0x7fff58c66a58[f1]hell

c++ - 无法手动调用 std::string 的析构函数

我正在试验union,并将这个示例设为A类,其中包含匿名union成员。由于union包含一个std::string和一个std::vector我需要为该类定义一个析构函数。但是,当我尝试手动调用~string()时,我得到了union.cpp:Indestructor'A::~A()':union.cpp:14:14:error:expectedclass-namebefore'('tokens_.~string();我不明白这个vector。如果我删除对s._~string();的调用,它可以正常编译。这是编译器错误吗?我正在使用MinGW64。#include#includecl