草庐IT

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++ - std::map::clear 和元素的析构函数

析构函数是否在std::map上被调用?std::map::clear时的元素用来?我尝试调试std::map但看不到std::string析构函数被调用。任何人都可以帮助我理解吗?文档说明它被调用了,但我没有注意到它。 最佳答案 文档是正确的,它确实被调用了。销毁将通过方法std::allocator::deallocate()完成。.在调试器中跟踪它。http://www.cplusplus.com/reference/std/memory/allocator/ 关于c++-std:

c++ - 不需要基类析构函数的定义?

在我看到的所有关于多态性的示例中,基类的析构函数都是virtual并且它是用空主体定义的。我正在努力解决这个问题:为什么它必须是一个空的body?如果该方法只是声明为virtual而不是用空主体定义,为什么它不起作用?那岂不是默认的析构函数就实现了?或者它被声明为virtual的事实甚至会抑制默认定义并强制显式定义主体?这就是我的意思:classA{public:virtualvoidf();virtual~A(){}}classB:publicA{public:~B(){//destroywhatever}}为什么~A()不能像这样声明virtual~A();没有定义?另外,为什么在

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

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

c++ - std::unique_ptr 是否在其析构函数中将其基础指针设置为 nullptr?

在实现我自己的unique_ptr时(只是为了好玩),我发现它不能通过这个testfile来自libstdcxx:structA;structB{std::unique_ptra;};structA{B*b;~A(){VERIFY(b->a!=nullptr);}};voidtest01(){Bb;b.a.reset(newA);b.a->b=&b;}gccpasses愉快地测试这个文件(当然,这个文件来自libstdcxx),而clangfails对于VERIFY部分。问题:它是依赖于实现还是未定义的行为?我想这个后置条件(b->a!=nullptr)对gcc很重要,否则它不会有测试

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++ std::sort() 调用析构函数

我重载了我的类的()运算符以将其用作排序比较器函数。使用std::sort()时,出于某种原因,它多次调用类的析构函数(显然取决于vector中的条目数量)。我在~RANK()中描述了更多内容。#include#include#include#includeclassRANK{structCOMBO{intx;};std::vectordata;public:RANK(){printf("RANK()\n");}~RANK(){printf("~RANK()\n");/**Hereistheproblem.*SincemyvectorconsistsofpointerstoCOMBOo

C++ unique_ptr 不调用析构函数

我有一个vector的unique_ptr指向一个叫做state的类。当我用vector调用pop_back()时,唯一指针从内存中删除(我认为),但它指向的状态对象永远不会被删除。那个或唯一指针在删除它指向的对象时不会以某种方式调用析构函数?我所知道的是,当我的唯一指针从vector中移除时,我的析构函数不会被调用。这是vector:std::vector>mStates;我试过:mStates.pop_back();这会删除唯一指针,我认为唯一指针会为我删除状态并调用状态的析构函数,但那没有发生。顺便说一句,我通过使用添加元素:mStates.push_back();