草庐IT

Destructor

全部标签

C++ 控制全局对象的析构函数顺序

我有一个类(A),它在其构造函数和析构函数中访问(通过静态方法间接访问)另一个类(B)中的静态变量(STL容器)。对象可以是全局的、全局常量、另一个类的静态成员、存储在其他类中(它们本身可能具有全局或静态实例)或者基本上是C++对象可以存在的任何其他地方。如果一个A对象在B中的静态成员之前构造或在B中的静态成员之后析构,它会在某个时刻导致崩溃(通常是访问冲突)。有什么方法可以保证类A的所有实例(除了那些已经泄漏的实例,因为根据定义在那里“丢失”并且不会以任何方式被销毁)在B的静态变量之后构造并在B的静态变量之前销毁?我见过一些使特定变量在另一个变量之前/之后构造/销毁的解决方案,但不是

c++ - 具有指针数组 C++ 的类的析构函数

如果我有一个包含指向另一个类Vehicle的指针数组的类:classList{public://stuffgoeshereprivate:Vehicle**vehicles;}如果我现在编写List类的析构函数,我是否手动遍历数组(我知道数组中有多少项)并删除每个指针到车辆,还是C++会自动调用数组中所有车辆的析构函数?(如果类中有一个私有(private)字符串/...,或者如果它是Vehicle指针的STL容器,就像它所做的那样)编辑:我忘记了delete[]vehicles,但如果我这样做,它会同时删除数组中所有车辆使用的内存,还是只删除指针使用的内存?

c++ - C++ 代码错误 "expected constructor, destructor, or type conversion before ‘(’ token ”和 "no matching function for call to ..."

真正尝试解决错误,仔细检查所有内容。请帮忙。c++新手,请多关照。头文件(.h)#ifndefGUARD_Optimized_quick_sort_h#defineGUARD_Optimized_quick_sort_h#include#include#includeusingnamespacestd;templateclassoptimized_quick_sort{public:optimized_quick_sort(vectorarray){this->array=array;}optimized_quick_sort(listarray){vectortemp(array.b

c++ - 在未构造的对象上调用析构函数

以下代码为g++版本4.6.2提供了一个异常(exception),但在g++版本4.2.1中按预期运行。执行期间打印的消息表明,在这两种情况下,都会在从未构造过的地址上调用析构函数。我想知道(a)哪个编译器是正确的,(b)为什么有些东西没有被创造就被破坏了。非常感谢。//------------------------------------------------------#includeusingnamespacestd;classPoly{private:float*coeff;public:Poly(){coeff=NULL;cout对于g++4.6.2,它给出了异常:%.

c++ - "Expected class-name"...析构函数实现中的问题

我正在尝试实现堆栈和队列。我还获得了用于测试堆栈和队列的代码(以查看它们各自的功能是否正常工作)。我已经实现了stack和quete的功能,但是在尝试编译它们时出现错误:在析构函数“Stack::~Stack()”中'('标记前的预期类名在他们两个。以下是通用的Stack类:templateclassStack{Listlist;public:Stack();Stack(constStack&otherStack);~Stack();}列表类:templateclassList{ListItem*head;public:List();List(constList&otherList);

c++ - 为什么 std::unary_function 不包含虚拟析构函数

我遇到了类模板std::unary_function和std::binary_function。templatestructunary_function{typedefArgargument_type;typedefResultresult_type;};templatestructbinary_function{typedefArg1first_argument_type;typedefArg2second_argument_type;typedefResultresult_type;};这两个都可以用作特定用途的基类。但是其中仍然没有虚拟析构函数。我猜的原因之一是这些并不意味着要进

c# - 管理托管 (C#) 和非托管 (C++) 对象的析构函数

我在c#dll中有一个托管对象,它为c++dll中的非托管对象维护一个匿名整数句柄。在c++dll内部,匿名整数在std::map中用于检索非托管c++对象。通过这种机制,我可以使用匿名整数句柄维护托管对象和非托管对象之间的松散关联。在托管对象的终结方法(析构函数)中,我调用了非托管dll以删除非托管对象。C#程序运行时一切正常,但程序退出时出现问题。因为我无法控制托管端的删除操作顺序,非托管dll在任何托管对象之前从内存中删除。因此,当托管对象的析构函数被调用时(它又[至少间接地]调用非托管析构函数),非托管对象已经被删除并且程序崩溃。那么我怎样才能安全地删除与c#程序中的托管对象相

c++ - 什么时候显式调用 C++ 析构函数?

哪些情况下需要显式调用析构函数? 最佳答案 当你使用placement-new是一个常见的原因(唯一的原因?):structfoo{};void*memoryLocation=::operatornew(sizeof(foo));foo*f=new(memoryLocation)foo();//note:notsafe,doesn'thandleexceptions//...f->~foo();::operatordelete(memoryLocation);这主要出现在分配器(由容器使用)中,分别在construct和destro

c++ - C++ 中的构造函数和析构函数失败

我有一个关于C++中失败的构造函数和失败的析构函数的问题。我注意到当构造函数失败时,会抛出一个异常。但是在析构函数中没有抛出异常。我的问题是1)如果构造函数失败,会抛出什么异常?坏分配?或其他相关的东西?在什么情况下,构造函数会失败?构建成功的部分呢?2)在什么情况下,析构函数会失败?如果没有抛出异常,析构函数会发生什么?编译器如何处理它?它所调用的函数的返回值是多少?谢谢!非常感谢任何意见! 最佳答案 如果构造函数失败,只有在实现构造函数时才会抛出异常,以便抛出异常。(您可能需要区分内存分配和构造。使用new分配内存可能会失败并引

c++ - 如何手动删除类的实例?

如何手动删除类的实例?例子:#include#includeclassCheese{private:stringbrand;floatcost;public:Cheese();//DefaultconstructorCheese(stringbrand,floatcost);//ParametrizedconstructorCheese(constCheese&rhs);//Copyconstrutor~Cheese();//Destructor//etc...otherusefulstufffollows}intmain(){Cheesecheddar("CabotClothboun