草庐IT

Destructor

全部标签

c++ - 析构函数应该是线程安全的吗?

我正在查看旧代码并找到以下代码段:MyClass::~MyClass(){EnterCriticalSection(&cs);//AccessDataMembers,**NOGlobal**membersarebeingaccessedhereLeaveCriticalSection(&cs);}我想知道是否有任何机会保护析构函数?考虑一个场景:1.Thread1-Abouttoexecuteanyofthememberfunctionwhichusescriticalsection2.Thread2-Abouttoexecutedestructor.如果执行顺序是1=>2,那么它可能

c++ - 析构函数应该是线程安全的吗?

我正在查看旧代码并找到以下代码段:MyClass::~MyClass(){EnterCriticalSection(&cs);//AccessDataMembers,**NOGlobal**membersarebeingaccessedhereLeaveCriticalSection(&cs);}我想知道是否有任何机会保护析构函数?考虑一个场景:1.Thread1-Abouttoexecuteanyofthememberfunctionwhichusescriticalsection2.Thread2-Abouttoexecutedestructor.如果执行顺序是1=>2,那么它可能

c++ - 为什么只有在声明自定义构造函数时才能访问基类析构函数?

Comeau、g++(ideone)和EDG接受以下代码而不进行诊断。VisualC++编译成功,但出现警告C4624。classindestructible_base{~indestructible_base();};classT:indestructible_base{public://T(){}};intmain(void){newT();}取消注释构造函数,它不再编译。也许是这样的规则,如果构造函数内部发生异常,必须销毁子对象?看起来很奇怪,因为主体是空的并且不会导致异常。即便如此,添加一个异常规范来保证不会抛出异常(throw()或noexcept),这没有任何区别。为什么用

c++ - 为什么只有在声明自定义构造函数时才能访问基类析构函数?

Comeau、g++(ideone)和EDG接受以下代码而不进行诊断。VisualC++编译成功,但出现警告C4624。classindestructible_base{~indestructible_base();};classT:indestructible_base{public://T(){}};intmain(void){newT();}取消注释构造函数,它不再编译。也许是这样的规则,如果构造函数内部发生异常,必须销毁子对象?看起来很奇怪,因为主体是空的并且不会导致异常。即便如此,添加一个异常规范来保证不会抛出异常(throw()或noexcept),这没有任何区别。为什么用

c++ - 非平凡析构函数使类非平凡可构造

考虑以下代码:#includestructT{};static_assert(std::is_trivially_destructible{});static_assert(std::is_trivially_default_constructible{});structN{~N(){;}};static_assert(!std::is_trivially_destructible{});static_assert(!std::is_trivially_default_constructible{});使用clang3.7.0编译良好:liveexample.但总结theStandar

c++ - 非平凡析构函数使类非平凡可构造

考虑以下代码:#includestructT{};static_assert(std::is_trivially_destructible{});static_assert(std::is_trivially_default_constructible{});structN{~N(){;}};static_assert(!std::is_trivially_destructible{});static_assert(!std::is_trivially_default_constructible{});使用clang3.7.0编译良好:liveexample.但总结theStandar

c++ - g++ __static_initialization_and_destruction_0(int, int) - 它是什么

编译c++文件(带有全局静态对象)后,我进入nm输出这个函数:00000000t_Z41__static_initialization_and_destruction_0ii__static_initialization_and_destruction_0(int,int)/*afterc++filt*/这是什么?它将调用__cxa_atexit()我可以禁用此函数的生成(并调用__cxa_atexit())并将所有构造函数和析构函数调用放在.ctors和.dtors部分? 最佳答案 这个doc文件似乎告诉你所有你想知道的关于这些函

c++ - g++ __static_initialization_and_destruction_0(int, int) - 它是什么

编译c++文件(带有全局静态对象)后,我进入nm输出这个函数:00000000t_Z41__static_initialization_and_destruction_0ii__static_initialization_and_destruction_0(int,int)/*afterc++filt*/这是什么?它将调用__cxa_atexit()我可以禁用此函数的生成(并调用__cxa_atexit())并将所有构造函数和析构函数调用放在.ctors和.dtors部分? 最佳答案 这个doc文件似乎告诉你所有你想知道的关于这些函

C++ 析构函数行为

这个问题在这里已经有了答案:Twocallstodestructor(3个回答)关闭7年前。我在VisualStudio2010上尝试了以下程序。#includeusingnamespacestd;classA{public:intp;/*A(){cout我得到的输出是-DestructorinDDestructorinAExitingmainDestructorinDDestructorinA我无法理解为什么要调用D类和A类的析构函数在“Exitingmain”语句执行之前?我尝试了另一件事-我在上面的代码中取消了对D类构造函数的注释,然后输出与我一样预期-ConstructorDE

C++ 析构函数行为

这个问题在这里已经有了答案:Twocallstodestructor(3个回答)关闭7年前。我在VisualStudio2010上尝试了以下程序。#includeusingnamespacestd;classA{public:intp;/*A(){cout我得到的输出是-DestructorinDDestructorinAExitingmainDestructorinDDestructorinA我无法理解为什么要调用D类和A类的析构函数在“Exitingmain”语句执行之前?我尝试了另一件事-我在上面的代码中取消了对D类构造函数的注释,然后输出与我一样预期-ConstructorDE