在做我的编程作业时,我似乎被基本的C++概念绊倒了。我在我的程序中发现了这个错误,它是由我的析构函数运行的次数超出我的预期造成的。这是一个代码示例,展示了我做错了什么,直到最基本的部分。#includeusingnamespacestd;classA{public:A(intnum){number=num;cout我希望发生的是Afoo(7);在堆栈上为名为foo的A对象分配空间并调用构造函数,传递7。它将7分配给number并打印指示构造函数运行的输出。现在Bbar(foo);在堆栈上为名为bar的B对象分配空间并调用构造函数,传递foo按值,它只是int的容器。构造函数将传递给它的
为什么不能编译?templateclassPool{charBuff[sizeof(T)*256];public:Pool(){T*item=reinterpret_cast(&Buff[0]);for(inti=0;i(&Buff[0]);for(inti=0;i~T();}voidreset(unsignedinti){T*item=reinterpret_cast(&Buff[0]);item[i]->~T();item[i]->T();}}我显然想要实现的是在原始内存数组上调用placementnew(应该调用构造函数ok)。然后我想调用数组中项目的析构函数和构造函数。问题是I
这是我正在处理的代码:#include#includeusingnamespacestd;staticunsignedlongcollatzLength(unsignedlongn){staticstd::mapcollatzMap;intmapResult=collatzMap[n];if(mapResult!=0)returnmapResult;if(n==1){return1;}else{collatzMap[n]=1+collatzLength(n%2==0?n/2:3*n+1);returncollatzMap[n];}}intmain(){intmaxIndex=1;uns
最近我正在关注rastertek上的教程并发现他们建议使用Shutdown()方法来清理而不是类自己的析构函数。他们提到的原因是当调用一些不安全的函数如ExitThread().但是,我怀疑即使无法调用析构函数,该方法是否会被执行。事实上,您总是可以在调用ExitThread()之前调用Shutdown()但为什么析构函数不一样呢?如果我可以在调用ExitThread()之前做一些事情,我当然也可以调用析构函数。将清理代码放在析构函数中是否比使用另一种方法更安全?我知道释放一些重要资源(如关闭文件)可能需要这种单独的方法来完成。但教程中似乎并非如此,是否还有其他原因?为了记录,我知道有
C++常见问题解答项目20.05:"Virtualbaseclassesarespecial,theirdestructorsarecalledattheendofthemostderivedclass'destructor(only)."我真的不明白这如何符合典型的:“先数据成员析构函数,再基类析构函数”规则虚基类有什么特别之处?我不知道上面的意思是什么:s 最佳答案 虚拟基类的关键属性是它们总是在派生类的任何对象中生成单个唯一基子对象。这正是虚拟基类的特别之处,这使得它们不同于可以生成多个子对象的常规基类。例如,在这个层级中st
我正在使用C++库。该库的最低要求是C++03。我在VisualStudio2015下发现了一些关于抛出析构函数的警告:...algparam.h(271):warningC4297:'AlgorithmParametersBase::~AlgorithmParametersBase':functionassumednottothrowanexceptionbutdoes...algparam.h(271):note:destructorordeallocatorhasa(possiblyimplicit)non-throwingexceptionspecificationthrow是
考虑这个简单的代码:classA{public:intvalue;A(intvalue){this->value=value;}~A(){printf("destroying%d\n",value);}Aoperator++(){returnA(value+1);}};intmain(){Aa(1);printf("beforeincrement:%d\n",a.value);a=++a;printf("afterincrement:%d\n",a.value);return0;}这个输出:beforeincrement:1destroying2afterincrement:2dest
在这篇文章中:C++Pointer:changingthecontentswithoutchangingtheaddress?用户EricPostpischil提出了一个他主动调用类的析构函数的答案。合法吗?它被认为是好的编程吗?我问的原因是,在我的一节课上,我的老师说这是被禁止的,我们永远不应该这样做,他错了吗?帖子中的问题和答案本身,虽然很有趣,但与我的问题并没有真正相关。 最佳答案 好吧,就像动态对象的创建过程可以“拆解”成两个阶段:原始内存分配和实际初始化(例如通过placement-new调用构造函数)一样,动态对象的销毁
我对析构函数有理解上的问题。在下面的例子中:#includeusingnamespacestd;classX{public:intid;X(intid){this->id=id;}~X(){cout我得到以下输出:destroying2这对我来说完全出乎意料,因为我认为析构函数总是在对象停止存在时被调用。但在这个例子中,对象1不再存在并被对象2取代。但不是调用对象1的析构函数,而是调用对象2的析构函数。谁能解释一下? 最佳答案 在您的情况下,只有一个对象被销毁-即您分配右侧的临时X(2)。原始的X(1)不会被破坏,因为它被赋值覆盖了
根据std::weak_ptr文档可以构造一个constexprweak_ptr:#includeconstexprweak_ptrfoo{};但是,使用clang尝试此操作会产生编译错误,提示constexpr变量不能具有非文字类型'conststd::weak_ptr',这是因为weak_ptr有一个用户提供的析构函数。(确实如此,查看libc++header)我的问题是,这是一个libc++错误,还是做constexprweak_ptr只是没有意义并且拥有constexpr默认构造函数是一个错误?我可以期待它在未来发挥作用吗? 最佳答案