草庐IT

Destructor

全部标签

c++ - 这个 C++ 析构函数是多余的吗?

我收到了一些C++代码,其中定义了各种结构,如下所示:typedefstruct_someStruct_{std::stringsomeString;std::vectorsomeVectorOfStrings;intsomeOtherStuff;~_someStruct_(){someString.clear();someVectorOfStrings.clear();}}someStruct;这里的析构函数是完全多余的吗?如果结构要被默认析构函数破坏,任何字符串、vector等都不会被破坏吗?如果我编写了代码,我就不会考虑在此处添加显式析构函数-我只会让编译器继续执行它。据我了解,

c++ - 这个 C++ 析构函数是多余的吗?

我收到了一些C++代码,其中定义了各种结构,如下所示:typedefstruct_someStruct_{std::stringsomeString;std::vectorsomeVectorOfStrings;intsomeOtherStuff;~_someStruct_(){someString.clear();someVectorOfStrings.clear();}}someStruct;这里的析构函数是完全多余的吗?如果结构要被默认析构函数破坏,任何字符串、vector等都不会被破坏吗?如果我编写了代码,我就不会考虑在此处添加显式析构函数-我只会让编译器继续执行它。据我了解,

c++ - 显式调用析构函数

我知道在大多数情况下,我们不应该显式调用析构函数。但是,我从C++11标准N3485第13.4.5节模板参数中看到了一个示例:Anexplicitdestructorcallforanobjectthathasatypethatisaclasstemplatespecializationmayexplicitlyspecifythetemplate-arguments.Example:templatestructA{~A();};voidf(A*p,A*q){p->A::~A();//OK:destructorcallq->A::~A();//OK:destructorcall}在我看

c++ - 显式调用析构函数

我知道在大多数情况下,我们不应该显式调用析构函数。但是,我从C++11标准N3485第13.4.5节模板参数中看到了一个示例:Anexplicitdestructorcallforanobjectthathasatypethatisaclasstemplatespecializationmayexplicitlyspecifythetemplate-arguments.Example:templatestructA{~A();};voidf(A*p,A*q){p->A::~A();//OK:destructorcallq->A::~A();//OK:destructorcall}在我看

c++ - RAII 与异常

我们在C++中使用RAII的次数越多,我们发现自己使用的析构函数就越多,这些析构函数会进行非平凡的释放。现在,解除分配(最终确定,但你想调用它)可能会失败,在这种情况下,异常确实是让楼上的任何人知道我们的解除分配问题的唯一方法。但是话又说回来,抛出析构函数是一个坏主意,因为在堆栈展开期间可能会抛出异常。std::uncaught_exception()让您知道何时发生这种情况,但仅此而已,因此除了让您在终止前记录消息之外,您无能为力,除非您愿意离开您的处于未定义状态的程序,其中一些东西被释放/最终确定,而另一些则没有。一种方法是使用无抛出析构函数。但在许多情况下,这只是隐藏了一个真正的

c++ - RAII 与异常

我们在C++中使用RAII的次数越多,我们发现自己使用的析构函数就越多,这些析构函数会进行非平凡的释放。现在,解除分配(最终确定,但你想调用它)可能会失败,在这种情况下,异常确实是让楼上的任何人知道我们的解除分配问题的唯一方法。但是话又说回来,抛出析构函数是一个坏主意,因为在堆栈展开期间可能会抛出异常。std::uncaught_exception()让您知道何时发生这种情况,但仅此而已,因此除了让您在终止前记录消息之外,您无能为力,除非您愿意离开您的处于未定义状态的程序,其中一些东西被释放/最终确定,而另一些则没有。一种方法是使用无抛出析构函数。但在许多情况下,这只是隐藏了一个真正的

c++ - C++ 是否为全局和类静态变量调用析构函数?

从我的示例程序中,看起来它在这两种情况下都调用了析构函数。它在什么时候调用全局变量和类静态变量的析构函数,因为它们应该分配在程序堆栈的数据部分? 最佳答案 来自C++03标准的第3.6.3节:Destructors(12.4)forinitializedobjectsofstaticstorageduration(declaredatblockscopeoratnamespacescope)arecalledasaresultofreturningfrommainandasaresultofcallingexit(18.3).The

c++ - C++ 是否为全局和类静态变量调用析构函数?

从我的示例程序中,看起来它在这两种情况下都调用了析构函数。它在什么时候调用全局变量和类静态变量的析构函数,因为它们应该分配在程序堆栈的数据部分? 最佳答案 来自C++03标准的第3.6.3节:Destructors(12.4)forinitializedobjectsofstaticstorageduration(declaredatblockscopeoratnamespacescope)arecalledasaresultofreturningfrommainandasaresultofcallingexit(18.3).The

c++ - 为什么我们需要使用 virtual ~A() = default;而不是 C++11 中的虚拟 ~A() {}?

在堆栈溢出帖子中CheckingtheobjecttypeinC++11,我有意见:InC++11you'llactuallywanttodovirtual~A()=default;Otherwise,you'lllosetheimplictmoveconstructors.virtual~A()=default;是干什么用的?virtual~A(){}为何会丢失隐式移动构造函数? 最佳答案 评论不正确。两者:virtual~A()=default;和virtual~A(){}被用户声明。如果析构函数是用户声明的,则隐式移动成员将被

c++ - 为什么我们需要使用 virtual ~A() = default;而不是 C++11 中的虚拟 ~A() {}?

在堆栈溢出帖子中CheckingtheobjecttypeinC++11,我有意见:InC++11you'llactuallywanttodovirtual~A()=default;Otherwise,you'lllosetheimplictmoveconstructors.virtual~A()=default;是干什么用的?virtual~A(){}为何会丢失隐式移动构造函数? 最佳答案 评论不正确。两者:virtual~A()=default;和virtual~A(){}被用户声明。如果析构函数是用户声明的,则隐式移动成员将被