草庐IT

Destructor

全部标签

c++ - 如果将变量设置为新对象,旧对象会发生什么情况?

假设我们有一个类X,它没有有一个重载的operator=()函数。classX{intn;X(){n=0;}X(int_n){n=_n;}};intmain(){Xa;//(1)anobjectgetsconstructedhere//morecode...a=X(7);//(2)anotherobjectgetsconstructedhere(?)//somemorecode...a=X(12);//(3)yetanotherobjectconstructedhere(?)return0;}是否在(2)处构造了一个新对象?如果是,在(1)处构造的旧对象会发生什么情况?它是自动销毁还是

对象被推回并且函数退出后,C++ vector 推回崩溃

问题是另一个访问vector并删除迭代器的类的愚蠢错误。与下面的代码无关。抱歉浪费您的时间。我一定是漏掉了一些基本的东西。我有一个函数可以创建一个对象,操作它的数据,然后将它插入一个vector中。函数退出的那一刻,程序崩溃并出现SIGSEV,我只能盯着(Kdevelopgcc4.5gdb)看:/***Thedtoronlyerasestheelements,andnotethatifthe*elementsthemselvesarepointers,thepointed-tomemoryis*nottouchedinanyway.Managingthepointeristheuser

c++ - lua - 类析构函数的延迟调用

我正在开发一个基本上只执行lua脚本的C++程序。然而,在该lua脚本中构造了类,这些类已从我的c++程序导出到lua脚本。我的main()c++函数只是在一些准备之后调用...luabind::call_function(m_L,"main");现在我的lua脚本是这样的localfunctiontest()localc=C()endfunctionmain()fori=1,2dolog(i)test()endend我包含了一个std::cout12destructordestructor而不是1destructor2destructor有人知道这是为什么吗?我在这里遗漏了什么吗?

c++ - 局部变量在超出范围时删除另一个变量的内存

这个问题在这里已经有了答案:WhatisTheRuleofThree?(8个答案)关闭9年前。在设计动态分配内存的类时,我遇到了以下有关内存分配的问题。我希望你们中的一些人能够为我指明正确的方向,让我知道我应该如何以更好的方式设计我的类(class)。我的类动态分配内存,因此也在其析构函数中将其删除。为了说明问题,请考虑以下愚蠢的类声明:classtestClass{int*data;public:testClass(){data=newint;*data=5;}~testClass(){deletedata;}};到目前为止一切顺利。现在假设我在main中创建了这些对象之一intma

c++ - 像普通方法一样调用构造函数和析构函数的注意事项和风险?

在我的程序中有一点需要将某个对象的状态重置为“出厂默认设置”。该任务归结为执行析构函数和构造函数中编写的所有内容。我可以删除并重新创建该对象——但我可以将析构函数和构造函数作为普通对象调用吗?(特别是,我不想将更新后的指针重新分配给新实例,因为它在程序其他地方的拷贝中徘徊)。MyClass{public:MyClass();~MyClass();...}voidreinit(MyClass*instance){instance->~MyClass();instance->MyClass();}我可以这样做吗?如果是这样,是否有任何风险、注意事项或我需要记住的事情?

c++ - 使用复制构造函数后双重释放子对象

我无法弄清楚为什么(看起来)一个对象被破坏了两次。如果我创建一个类(B)的对象,其中包含另一个类(A)的对象,并且我复制该对象。复制的对象被破坏两次。虽然它看起来像这样。我无法弄清楚这个输出。我创建了以下(至少?)示例,它似乎触发了我的问题:#include#includetemplateclassA{public:A(){myCtr=++ctr;printf("classAdefaultConstructor-objectid:%u\n",myCtr);}A(constA&a2){myCtr=++ctr;printf("classAcopyconstructor-objectid:%

c++ - 析构函数 : triviality vs implicit definition

根据我对标准的理解,普通析构函数是一种隐式声明的析构函数,其类只有基本和非静态成员以及普通析构函数。鉴于此定义的递归性,在我看来,唯一的“递归停止”条件是找到具有非隐式声明的析构函数(即用户声明的)的基类或非静态成员。如果那是对的,那应该意味着一个普通的析构函数是一个“不需要做任何事情”的析构函数,因此它将被声明(隐式地)但不被定义。换句话说:根据标准定义,隐式定义析构函数(即“它做某事”)不能是微不足道的说法是否正确?很抱歉提出这种愚蠢的问题,但我想澄清一下我的想法...... 最佳答案 没有。隐式定义的平凡析构函数根据定义是平凡

c++ - 显式析构函数

下面的代码只是用来说明我的问题。templateclassarray{public://constructorarray(cap=10):capacity(cap){element=newT[capacity];size=0;}//destructor~array(){delete[]element;}voiderase(inti);private:T*element;intcapacity;intsize;};templatevoidclassarray::erase(inti){//copy//destructobjectelement[i].~T();//////othercod

C++:并发和析构函数

假设您有一个可以被多个线程访问的对象。临界区用于保护敏感区域。但是析构函数呢?即使我一进入析构函数就进入临界区,一旦调用了析构函数,对象就已经失效了吗?我的思路:假设我进入析构函数,我必须在临界区等待,因为其他线程仍在使用它。一旦他完成,我就可以完成销毁该对象。这有意义吗? 最佳答案 一般来说,你不应该销毁一个对象,直到你知道没有其他线程正在使用它。期间。根据您的“思路”考虑这种情况:线程A:获取对象X引用线程A:锁定对象X线程B:获取对象X引用线程B:在对象X锁上阻塞线程A:解锁对象X线程B:锁定对象X;解锁对象X;销毁对象X现在

c++ -/boost/lockfree/queue.hpp: 错误: 静态断言失败: (boost::has_trivial_destructor<T>::value)

我正在尝试替换boost::lockfree::queue对于std::queue在这个文件中https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp我添加了#include;改线130,std::queuem_actions;,至boost::lockfree::queuem_actions;;删除所有与锁定有关的行;并更改了行103,m_actions.pop();,至m_actions.pop(a);.我在sconsbroadcas