草庐IT

Destructor

全部标签

c++ - 我如何*不*删除析构函数中的成员?

我希望我的类的析构函数删除整个对象,但其中一个成员除外,该成员在其他地方被删除。首先,这完全不合理吗?假设不是,我该怎么做?我认为创建一个空主体的析构函数会阻止所有成员被删除(因为析构函数不会做任何事情),但事实似乎并非如此。 最佳答案 简答:你不知​​道。更长的答案:如果“成员”实际上是指向其他分配的指针,您可以安排不删除其他分配。但是通常,如果你在构造函数中分配了另一个block,你想在析构函数中删除它。其他任何事情都需要仔细处理相关block的“所有权”。它将很像普通c中的内存管理。可能,但充满危险。祝你好运。

c++ - 局部变量是在评估函数返回值之前还是之后销毁的?

我正在考虑制作一个代表同步原语的所有权的类,如下所示:classCCriticalSectionLock{public:CCriticalSectionLock(CCriticalSection&cs):cs(cs){cs.Enter();}~CCriticalSectionLock(){cs.Leave();}private:CCriticalSection&cs;};这看起来是一个很好的方法,可以在函数执行期间获得所有权并确保释放所有权,即使存在多个退出点或异常也是如此。然而,它确实会引发一些微妙的问题,即编译器何时会对各种事物进行评估。考虑以下用途:intMyMethod(voi

c++ - 析构函数末尾的段错误

我不知道这个问题是否会很清楚,因为我不能提供太多细节(我使用的是TPL,并且自己写了很多行)。但我会试一试。我遇到了一个我无法理解的段错误。有一个结构(我没有设计但应该经过充分测试)的析构函数如下所示Data::~Data(){if(A_!=0){deleteA_;A_=0;}if(B_!=0){deleteB_;B_=0;}if(C_!=0){deleteC_;C_=0;}}//HERE令我困扰的是,在调试时,我发现段错误发生在标有“HERE”的行。Data类只有A_、B_和C_作为动态分配的属性。我还尝试在其他非动态复合属性上显式调用析构函数,以查看在销毁过程中是否出现问题,但段错

c++ - 标准库中是否有与 Rust 的 `std::mem::drop` 等效的 C++?

函数std::mem::drop在Rust中move它的参数,然后通过超出范围来销毁它。我在C++中编写类似函数的尝试如下所示:template::value>>voiddrop(T&&x){T(std::move(x));}标准库中是否已经存在这样的函数?编辑:该函数可用于在超出范围之前调用对象的析构函数。考虑一个类,它在文件句柄被销毁后立即关闭,但不会更早。为了论证,假设ofstream没有close方法。你可以这样写:ofstreamf("out");f 最佳答案 C++的标准库没有这样的函数。但是,您可以使用此成语实现相同的

c++ - 基类中的非虚析构函数,但派生类中的虚析构函数导致段错误

最近在一次工作面试中,我被问及当基类的析构函数未声明为虚拟时派生类中内存泄漏的问题。我写了一个小测试来确认我的答案,但我发现了一些有趣的东西。显然,如果您通过new创建一个Derived对象,但将其指针存储为Base*,则不会调用派生对象的析构函数,如果指针被删除(我对问题的回答就这么多)。我认为在这种情况下派生类的析构函数是否为虚函数无关紧要,但在我的系统上,以下代码显示了其他情况:#include#include//justahelperclass,printingitsnameoutwhenitisdestructedclassPrintOnDestruct{public:Pri

c++ - 为什么析构函数被调用的次数比构造函数多?

这个问题在这里已经有了答案:Twocallstodestructor(3个答案)关闭7年前。在下面的代码中,析构函数被调用了两次,而构造函数只被调用了一次:enumTFoo{VAL1,VAL2};classCFoo{public:TFoomf;CFoo(){coutv;//v.assign(1,VAL1);v.push_back(VAL1);}代码输出:hic'tor2byebye我找到了一个类似的question,其中提到了复制构造函数,所以我添加了它们,但结果相同。取消注释行//v.assign(1,VAL1);也不会改变任何东西。

c++ - move 的对象仍然被破坏?

在学习C++11时,我对move对象的行为方式感到惊讶。考虑这段代码:#include#include#includeclassMoveable{public:Moveable(){std::cout::value,"isnotcopyconstructible");static_assert(!std::is_copy_assignable::value,"isnotcopyassignable");static_assert(std::is_move_constructible::value,"ismoveconstructible");static_assert(std::is_

c++ - 我可以有一个 ~destructor(void) 吗?

这个问题在这里已经有了答案:Isthereadifferencebetweenfoo(void)andfoo()inC++orC?(4个答案)关闭8年前。查看我的一些旧代码,我发现出于笨拙我定义了一个析构函数:~ResourceManager(void);这不仅可以编译,而且可以按预期工作。我当然把它改成了~ResourceManager();但是我重构的速度太快了吗?第一个版本是否正确且良好的C++风格?编辑由于问题已经结束并且不会有任何机会进行适当的消歧,所以当透视析构函数时,我应该引用标准中的相关引述来回答这个问题12.4析构函数Aspecialdeclaratorsyntaxu

c++ - 调用析构函数的顺序和要点

假设我有两个本地对象。函数返回时,是否保证哪个先出作用域?例如:我有这样一个类:classMutexLock{/*AutomaticunlockingwhenMutexLockleavesascope*/public:MutexLock(Mutex&m){M.lock();}~MutexLock(Mutex&m){M.unlock();}};这是一个非常常用的技巧,用于在超出范围时自动释放互斥量。但是,如果我在作用域中需要两个互斥锁怎么办?void*func(void*arg){MutexLockm1;MutexLockm2;do_work();}//m1andm2willgetunl

c++ - 我们能否在可能的情况下使用返回值优化,而在可能的情况下退回到移动而不是复制语义?

是否可以编写C++代码,在可能的情况下依赖返回值优化(RVO),但在不行的情况下回退到移动语义?例如,下面的代码由于有条件不能使用RVO,所以它把结果复制回来:#includestructFoo{Foo(){std::cout这产生constructorconstructorcopydestructordestructorfindestructor这是有道理的。现在,我可以通过更改行来强制在上面的代码中调用移动构造函数returnb?x:y;到returnstd::move(b?x:y);这给出了输出constructorconstructormovedestructordestruc