草庐IT

c++ - 在分配期间调用不需要的对象的析构函数

myClassVar=MyClass(3);我希望在左侧先前创建的myClassVar上调用析构函数。但它实际上是在MyClass(3)创建的新对象上调用的。我的完整测试代码和输出如下..编辑我该如何解决这个问题?实现赋值运算符?MyClass其实是有指针的,还有MYSQL_STMT*,我想知道我应该如何处理MYSQL_STMT*变量。我只需要MyClassVar(3)对象而不是在创建ClientClass对象时首先创建的MyClassVar()。我经常遇到这种情况,想知道是否有好的方法。#includeclassMyClass{public:MyClass(){printf("MyC

c++ - 使用 shared_ptr 时奇怪的双析构函数调用

最后我找到了一个非常奇怪的错误,这是由两次调用析构函数引起的。这是重现错误的最少代码:#include#include#includeclasscEventSystem{public:cEventSystem(){std::cout(eventSystem);}voidonEvent(){}std::shared_ptrtileBrowser;};intmain(){cEventSystemeventSystem;cGuigui(eventSystem);}输出是:constructor:0x7fffffffe67fdestructor:0x7fffffffe2dfdestructor

C++ 析构函数返回类型

析构函数是一种特殊的成员函数,它不接受任何参数,也没有返回类型:几乎所有的C++书籍中都提到了这一点。但是,在libstd++库中,它使用以下内容来测试类型是否可破坏,struct__do_is_destructible_impl{template().~_Tp())>statictrue_type__test(int);templatestaticfalse_type__test(...);};Gnug++会显示带有typeidvoid的_U,那么,析构函数会返回一个类型吗?请专家解释一下c++标准对此有何规定。 最佳答案 请注意

c++ - 即使没有析构函数,非静态类成员也会被销毁吗?

在BjarneStroustrup的“TheC++ProgrammingLanguage(4thedition)”第17.6节(生成默认操作)中提到了这一点:Iftheprogrammerdeclaresacopyoperation,amoveoperation,oradestructorforaclass,nocopyoperation,moveoperation,ordestructorisgeneratedforthatclass.因此,我很困惑为什么要在这个程序中调用SubObj析构函数:#includeusingnamespacestd;classSubObj{public:

c++ - 为什么 Visual C++ 6 提示私有(private)析构函数

以下代码适用于VisualC++2008。但是,当涉及到VisualC++6时,出现以下错误。我可以知道为什么,以及如何修复错误,但仍然使析构函数保持私有(private)。classX{public:staticX&instance(){staticXdatabase;returndatabase;}private:X(){}//Privateconstructor~X(){}//PrivatedestructorX(constX&);//Preventcopy-constructionX&operator=(constX&);//Preventassignment};intmain

c++ - 使用虚拟析构函数会使非虚拟函数进行 v 表查找吗?

正是主题所问的。还想知道为什么CRTP的常见示例中没有提到virtualdtor。编辑:伙计们,请也发布有关CRTP问题的信息,谢谢。 最佳答案 只有虚函数需要动态调度(因此vtable查找),甚至在所有情况下都不需要。如果编译器能够在编译时确定什么是方法调用的最终覆盖,它就可以避免在运行时执行分派(dispatch)。如果需要,用户代码也可以禁用动态调度:structbase{virtualvoidfoo()const{std::cout关于是否应该在所有继承情况下都提供虚析构函数,答案是否定的,不一定。仅当代码删除通过指向基类型

c++ - 返回值优化 - C++ - 析构函数调用

以下代码调用析构函数4次:#includeusingnamespacestd;classA{public:A(){cout输出:AAFA~A~A~A~A有人能解释一下吗?我在想应该只有三个析构函数调用。 最佳答案 main()中有两个对象,因此析构函数将被调用两次只是因为它们。f()中的一个对象,因此析构函数将因此被调用一次。总共3次(如您所料,但请继续阅读……)现在第四次为从f返回时创建的临时对象调用析构函数。这只有在根本没有RVO时才会发生。RVO是编译器的选择,这意味着它可能会优化它,也可能不会。该语言不对RVO提供任何保证。

c++ - 在 C++11 的析构函数中锁定互斥量

我有一些代码需要线程安全和异常安全。下面的代码是我的问题的一个非常简化的版本:#include#includestd::mutexmutex;intn=0;classCounter{public:Counter(){std::lock_guardguard(mutex);n++;}~Counter(){std::lock_guardguard(mutex);//HowcanIprotectheretheunderlyingcodetomutex.lock()?n--;}};voiddoSomething(){Countercounter;//HereIcoulddosomethingm

c++ - 在析构函数中尝试 Catch block

在阅读HurbSutter的“MoreExceptionalC++”时,我偶然发现了以下代码://Example19-5:Alternativerightsolution//T::Close(){//...codethatcouldthrow...}T::~T()/*throw()*/{try{Close();}catch(...){}}我的理解是,这不是一个好主意。因为,如果在堆栈展开期间由于异常调用了T析构函数,然后Close()抛出异常,那么这将导致调用Terminate()。有人可以阐明这一点吗?提前致谢。 最佳答案 Myu

c++ - 智能指针析构函数调用的 vector

为什么在下面的代码中节点析构函数只被调用一次而不是5次?#include#include#includestructNode{~Node(){std::cout>nodes(5,std::make_shared());}intmain(){foo();std::cout 最佳答案 您的vector包含原始共享指针的五个拷贝,所有拷贝都共享一个指针对象的所有权。要创建五个独立的对象,每个对象由一个共享指针拥有,可以这样写:std::vector>nodes;for(inti=0;i!=5;++i)nodes.push_back(std