destructor 相关问题

面向对象编程中的一种特殊方法,在对象被销毁时调用

可以在不调用析构函数的情况下 goto 跳转函数吗?

goto 真的可以跳过一些代码而不调用析构函数和其他东西吗? 例如 无效 f() { 整数x=0; 转到哈哈; } int main() { F(); 哈哈: 返回0; } x不会被泄露吗?

回答 1 投票 0

这些析构函数调用中哪些被执行了多次?

我现在正在学习C++,之前是Java。我确实知道我应该使用向量而不是数组,但是我也想了解基础知识。 我已经编写了一个我想要访问的结构...

回答 1 投票 0

“删除这个”有什么用?

今天,我看到了一些遗留代码。在析构函数中有一个类似“delete this”的语句。我认为,这个调用将是递归的。为什么它有效? 我在 Y! 上进行了一些快速搜索,我发现...

回答 4 投票 0

为什么浅复制类型的析构函数中使用delete会出现双重释放?

我不明白为什么下面的代码会出错。 对象 A 的实例将被连续推入向量 (vectorA.push_back(A a)) 中。所以有时候,vectorA需要重新分配;

回答 2 投票 0

为什么当链表节点在析构函数中删除其邻居时会发生释放后使用?

我在删除和析构函数方面遇到了问题(我确信我在这里犯了一个愚蠢的错误,但到目前为止还无法弄清楚)。 当我进入析构函数并尝试...

回答 3 投票 0

删除表达式是否调用析构函数?

我正在动态地将内存分配给一个对象,然后如果我调用删除会发生什么? 调用析构函数或删除函数有不同的处理内存的方式吗? 考虑以下例子...

回答 3 投票 0

c++何时进行向量push_back深拷贝对象?

我创建了一个向量并使用push_back将几个节点对象放入其中。但是,我无法预测何时将使用移动构造函数或复制构造函数。 推的时候有什么模式吗...

回答 1 投票 0

临时对象什么时候销毁?

以下代码打印一、二、三。所有 C++ 编译器都希望如此吗? #包括 结构体Foo { const char* m_name; ~Foo() { std::cout << m_name <...

回答 5 投票 0

临时函数参数的生命周期是多长?

当创建 MyClass 的新实例作为函数的参数时,如下所示: 我的班级 { MyClass(int a); }; myFunction(MyClass(42)); 标准是否对时间做出任何保证

回答 4 投票 0

为什么临时对象会在块作用域结束之前被销毁?

以下代码打印一、二、三。所有 C++ 编译器都希望如此吗? #包括 结构体Foo { const char* m_name; ~Foo() { std::cout << m_name <...

回答 5 投票 0

C++:临时参数的生命周期?

当创建 MyClass 的新实例作为函数的参数时,如下所示: 我的班级 { MyClass(int a); }; myFunction(MyClass(42)); 标准是否对时间做出任何保证

回答 4 投票 0

关于 clang AST 和析构函数的 odr 使用

对于以下代码 结构体 X { 整数a; }; int main() { ××; 返回0; } clang AST 不显示 DestructorDecl: CXXRecordDecl 0x55a415f54f00 对于以下代码 struct X { int a; }; int main() { X x; return 0; } clang AST 不显示 DestructorDecl: CXXRecordDecl 0x55a415f54f00 </home/gkxx/exercises/smfgen/tmp/../tmp/a.cpp:1:1, line:4:1> line:1:8 referenced struct X definition |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal | |-DefaultConstructor exists trivial | |-CopyConstructor simple trivial has_const_param implicit_has_const_param | |-MoveConstructor exists simple trivial | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param | |-MoveAssignment exists simple trivial needs_implicit | `-Destructor simple irrelevant trivial needs_implicit |-CXXRecordDecl 0x55a415f55018 <col:1, col:8> col:8 implicit struct X |-FieldDecl 0x55a415f550c0 <line:2:3, col:7> col:7 a 'int' |-CXXConstructorDecl 0x55a415f55320 <line:1:8> col:8 implicit used X 'void () noexcept' inline default trivial | `-CompoundStmt 0x55a415f557d8 <col:8> |-CXXConstructorDecl 0x55a415f55458 <col:8> col:8 implicit constexpr X 'void (const X &)' inline default trivial noexcept-unevaluated 0x55a415f55458 | `-ParmVarDecl 0x55a415f55568 <col:8> col:8 'const X &' `-CXXConstructorDecl 0x55a415f55618 <col:8> col:8 implicit constexpr X 'void (X &&)' inline default trivial noexcept-unevaluated 0x55a415f55618 `-ParmVarDecl 0x55a415f55728 <col:8> col:8 'X &&' 我尝试获取 CXXRecordDecl 的 struct X,发现 decl->getDestructor() 返回 nullptr。 这让我有点困惑,因为标准规定,没有用户声明的析构函数的类将有一个隐式声明的析构函数,并且在使用 odr 时它将是隐式定义的。那么什么是 odr-使用析构函数?这个X的析构函数是odr使用的吗?或者这只是我对 clang AST 和 clang::CXXRecordDecl::getDestructor 行为的误解? 请注意,相比之下,clang-AST 显示定义了 X 的默认构造函数,即使它不执行任何操作。 这个析构函数是 ODR 使用的吗? 是的。引用basic.def.odr: 如果类的析构函数可能被调用,则它是 odr-used。 其中“潜在调用”有一个不平凡的定义,但简而言之, 此处为 true,因为 main() 声明了一个 X 类型的对象。 Clang getDestructor() 是 nullptr 是什么意思? 文档 CXXRecordDecl::getDestructor() 只是说: 返回此类的析构函数 decl。 甚至不承认它可以返回nullptr,更不用说 解释这意味着什么。基于阅读源代码,我 结论这意味着析构函数是微不足道的,并且没有一个 无论如何都会导致创建隐式声明的条件 (见下文)已经很满意了。 它确实not意味着Clang声称析构函数不是 使用 ODR。这 Decl::isUsed() 方法声称报告此信息(请参阅有关 setIsUsed()),但似乎并不完全准确;甚至 如果我通过添加一个来创建析构函数声明 virtual函数,析构函数还没有标记isUsed()。 标准不是说析构函数应该在这里定义吗? 是的——但为了保持一致,Clang 只需要生成编译后的输出 其行为“就好像”析构函数已被定义。缺少一个 特定的 AST 节点不会使其不合格。即使缺乏一个 编译目标文件中的定义则不然,只要它遵循 相关的ABI,从而配合其他工具,再次实现 所需的“好像”行为(假设源代码 符合单一定义规则)。 Clang 创建隐式声明的条件是什么? 这似乎没有记录,所以我试图从 来源。隐式析构函数声明是通过以下方式创建的 Sema::DeclareImplicitDestructor() 在 SemaDeclCXX.cpp:13803。 这个函数在好几个地方都被调用了,我没有全部遵循 链条向后,但对于第一个近似值,这不会 调用如果: 析构函数本身是微不足道的,并且 该类没有 vtable,并且 析构函数之间不需要重载决策(这可能 需要requires)。 请注意,这是最后一个条件,由于 x 的声明,导致 Clang 声明三个隐式 con讲师。 我可以强制声明析构函数吗? 是的!您可以致电 Sema::ForceDeclarationOfImplicitMembers 在 CXXRecordDecl 上强制 Clang 甚至声明隐式成员 否则它就不会这样做。例如,就在之后 解析时,您可以使用 RecursiveASTVisitor 遍历 AST 并在每个 CXXRecordDecl 上调用此方法。 完成此操作后,所有隐式成员都将可用。 我如何获得 Sema 对象? 您无法从 ASTContext 获取它,因为那只是 AST, 而 Sema 是创建 AST 过程的一部分。 (如果你 如果将 AST 保存到磁盘然后再加载回来,就不会出现 Sema 根本就是物体。) 我的首选方法是使用 ASTUnit::LoadFromCompilerInvocation 进行初始解析。这会立即产生一个 ASTUnit 对象, 从中您可以获得 Sema (通过 getSema())和 ASTContext(通过getASTContext())。 如果您使用的是 ClangTool, 这就是 教程 指向人们,你必须使用它的 buildASTs 方法而不是 run。这可能需要对您的分析方式进行一些重构 但是,因为在这种情况下它不会调用 ToolAction。

回答 1 投票 0

对象实例在销毁后仍然可以访问

我有一个 Animal 结构,其中包含 Dog 结构作为数据成员,我的问题是为什么创建的 Dog 实例(在 Animal 内部)仍然可以通过分配的 Animal 实例访问

回答 1 投票 0

{“error”:“无法解构“req.body”的属性“title”,因为它未定义。” }

以下是 Node.js 应用程序的代码片段: // src/models/workoutsModel.js const 猫鼬 = require("猫鼬"); const Schema = mongoose.Schema; 常量锻炼模式 = 新

回答 1 投票 0

禁用删除析构函数的生成

我正在开发一个不使用动态内存分配的嵌入式系统程序。如何防止 GCC 生成删除析构函数(名称中带有 D0 的析构函数)?...

回答 1 投票 0

当 Python 中的 Tkinter.Tk 窗口时,我可以重写哪种方法来执行清理任务?

MainGUI 类(Tkinter.Tk): # 一些覆盖 # 主要的 gui = MainGUI(无) gui.mainloop() 但是当用户关闭窗口时我需要进行一些清理。我可以使用 Tkinter.Tk 中的哪种方法

回答 3 投票 0

函数调用会破坏返回对象,即使它没有显式构造? C++

因此,我将两个 Word 对象的重载相加称为 词w; w + w; 声明和定义是: 句子运算符+(const Word&) const; 句子单词::operator+(const Word&

回答 1 投票 0

C++ 中的类析构函数

我创建了一个类书,其中包含一些类属性,例如名称和作者(没有动态分配),然后我创建了一个类库,其中包含动态书籍数组(如 book* set)及其...

回答 1 投票 0

了解 C++ 中按值传递对象时的复制构造函数和临时对象创建

给出下一个代码: #包括 #包括 #包括 类人 { 民众: 人(const char *i_Name =“未知”,int i_Age = 0) : 我...

回答 1 投票 0

`unordered_map::erase()`总是立即调用析构函数吗?

假设我有 std::unordered_map myMap;。如果我调用 myMap.erase(1);,Foo 的析构函数是否总是立即被调用?或者标准库是否允许挂在 F 的该实例上......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.