草庐IT

StaticClass_Dtor

全部标签

c++ - `weak_ptr::expired` 对象 dtor 中的行为

考虑以下代码:#include#includeusingnamespacestd;classT;std::weak_ptrwptr;classT{public:T(){}~T(){std::cout();wptr=ptr;std::cout在这段代码中,我试图找出weak_ptr是否在对象销毁阶段过期。似乎是这样。输出是:notexpiredindtorexpired我使用gcc-5.1和ideone.现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是? 最佳答案 Now,Ihaveanother

c++ - `weak_ptr::expired` 对象 dtor 中的行为

考虑以下代码:#include#includeusingnamespacestd;classT;std::weak_ptrwptr;classT{public:T(){}~T(){std::cout();wptr=ptr;std::cout在这段代码中,我试图找出weak_ptr是否在对象销毁阶段过期。似乎是这样。输出是:notexpiredindtorexpired我使用gcc-5.1和ideone.现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是? 最佳答案 Now,Ihaveanother

c++ - shared_ptr 的 dtor 是否需要使用 "deleter"?

It'swidelyknown您可以使用shared_ptr来存储指向不完整类型的指针,只要在构造shared_ptr期间可以删除该指针(具有明确定义的行为).例如,PIMPL技术:structinterface{interface();//out-of-linedefinitionrequired~interface()=default;//publicinlinemember,evenifimplicitlydefinedvoidfoo();private:structimpl;//incompletetypestd::shared_ptrpimpl;//pointertoinco

c++ - 由在 DTor 之前删除的静态对象创建的线程?

我的代码中有以下类。换句话说,CTor中有一个创建线程的静态对象(单例),当它的DTor被调用时,它有一些工作要做在这个线程的上下文中(DTor为线程放置一些工作)。我面临的问题是,当调用B的DTor时,进程中没有其他线程在运行-似乎这个线程在调用B类的析构函数之前被进程清理杀死。有人知道为什么会这样吗?以及如何避免?UPD:仅当从DLL创建Singleton时才会出现问题。当从同一个可执行文件创建Singleton时,一切正常。我正在使用VS2017Singleton.dll(A.h+A.cpp)A.h-->#pragmaonce#includeclass__declspec(dll

c++ - 数组对象初始化,其类具有一些 ctor/dtor

我想通过如下初始化语句实现数组对象的初始化。TestClassarray[5]={TestClass("test1"),TestClass("test2"),TestClass("test3"),TestClass("test4"),TestClass("test5")};根据一些权威书籍如ARM(annotatedreferencemanual)forC++,似乎说这是初始化具有构造函数/析构函数的对象数组的方法。在此之后,我刚刚创建了以下示例代码,看看会发生什么。#include#include#includeclassTestClass{public:TestClass(cons

c++ - std::unordered_map<std::String, myClass*> - std::unordered_map::erase() 是否调用 myClass 的 DTor?

假设我有一些unordered_map指向类实例的指针,从该映射中删除一个对象是否也会删除该实例?(改写问题:)如果我想删除那个实例,哪个版本是正确的?if(it!=map.end()){deleteit->second;map.erase(it);}或者只是if(it!=map.end())map.erase(it);?更新:根据很多人的建议,我转而使用shared_ptr,效果很好! 最佳答案 不,因为这是标记的C++11,你应该首先使用std::unique_ptr/std::shared_ptr来管理你的对象指针,例如std

c++ - 在结构的 STL 映射中,为什么 "[ ]"运算符会导致结构的 dtor 被额外调用 2 次?

我创建了一个简单的测试用例,展示了我在处理的较大代码库中注意到的奇怪行为。这个测试用例如下。我依靠STLMap的“[]”运算符在此类结构的映射中创建一个指向结构的指针。在下面的测试用例中,行...TestStruct*thisTestStruct=&testStructMap["test"];...获取指针(并在map中创建一个新条目)。我注意到的奇怪之处在于,这一行不仅导致在映射中创建一个新条目(因为“[]”运算符),而且由于某种原因它导致结构的析构函数被额外调用两次。我显然遗漏了一些东西-非常感谢任何帮助!谢谢!#include#include#includeusingnamesp

c++ - 普通 ctor(或 dtor)和用户定义的空 ctor(或 dtor)之间有什么区别

当类具有普通构造函数和/或普通析构函数时,C++标准定义了一些非常具体的行为。例如,根据标准的§3.8/1:ThelifetimeofanobjectoftypeTendswhen:—ifTisaclasstypewithanon-trivialdestructor(12.4),thedestructorcallstarts,or—thestoragewhichtheobjectoccupiesisreusedorreleased.所以,如果一个对象不是普通可破坏的,则在调用析构函数后访问该对象成员的任何尝试都是UB。如果一个对象是普通可破坏的,则在调用析构函数后尝试访问该对象的成员是