问题标签 [explicit-destructor-call]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 我们是否需要为分配有“新位置”的“简单 POD 类”显式调用析构函数?
这里的“简单”是指具有非虚拟空析构函数或 POD 类型的类。
典型例子:
如果我们不调用显式析构函数 on 会发生什么p
?我不认为这是未定义的行为或内存泄漏。
重复使用有什么问题buffer
吗?
c++ - 用作对象的封装字符数组是否违反了严格的别名规则
下面的类是否打破了严格的别名规则:
我对标准的解读是它是不正确的,但我不确定(我的用法是拥有一个对象数组T
+这些对象的一些元数据,但是可以在不手动分配内存的情况下控制对象构造/解构)作为分配的对象被用作new
标准中放置的示例。
c++ - 一个对象被销毁后,标量类型的子对象会发生什么?
renew
考虑这段代码(对于和的不同值cleanse
):
assert
保证通过吗?
我知道不推荐这种风格。像“这不是一个合理的做法”这样的观点在这里并不感兴趣。
我想要一个答案,显示标准报价的完整逻辑证明。编译器作者的意见也可能很有趣。
编辑:现在有两个问题!查看renew
参数(使用renew == 0
,这是原始问题)。
编辑2:我想我的问题真的是:什么是成员对象?
编辑 3:现在有了另一个cleanse
参数!
c++ - 手动调用析构函数并重用内存
虽然我知道这可能不是最好的想法,但我假设性地问:
手动调用对象的析构函数,然后将内存重新用于另一个对象是否合法(即定义的行为)?
定义:
代码:
c++ - C++,类的空析构函数
我已经阅读了您的一个答案(“空”构造函数或析构函数会与生成的构造函数做同样的事情吗?)。您写道:“假设 C 类型的对象是在 .cpp 文件中 A 的构造函数的定义中创建的,该文件还包含 struct C 的定义。现在,如果您使用 struct A 并要求销毁 A 对象,编译器将提供析构函数的隐式定义,就像上面的情况一样。该析构函数还将隐式调用 auto_ptr 对象的析构函数。这将删除它持有的指向 C 对象的指针 - 不知道C 的定义!出现在 .cpp 文件中,其中定义了 struct A 的构造函数”。你能为我解释两件事吗:1.为什么A的析构函数应该知道C的定义?2. 添加A的空析构函数对定位有什么帮助?谢谢
c++ - 我什么时候应该防止隐式破坏?它是如何工作的?
我知道我可以声明一个析构函数=delete
,或者private
为了防止程序在范围末尾隐式删除对象。我也知道,如果它是私有的,我可以有一个成员函数,只要我调用它就可以显式调用析构函数:void kill() { this–>~A(); }
我的问题是:
为什么我要防止隐式破坏?请举个例子
会
=delete
做什么?它是否确保析构函数永远不会运行?那么该对象将永远存在于其范围之外吗?
c++ - 为什么 std::move 之后的析构函数调用是必要的?
在 C++ 编程语言第 4 版中,有一个向量实现的示例,请参阅消息末尾的相关代码。
uninitialized_move()通过将新的 T 对象从旧的内存区域中移动来将它们初始化到新的内存区域中。然后它调用原始 T 对象(即移出对象)的析构函数。为什么在这种情况下需要调用析构函数?
这里是我的不完全理解:移动一个对象,就是将被移动对象所拥有的资源的所有权转移给被移动对象。移动对象中的剩余部分是不需要销毁的内置类型的一些可能成员,当 vector_base b 超出范围时(在reserve()内部,在swap()调用之后),它们将被释放)。移出对象中的所有指针都将被放置到 nullptr 或采用某种机制来删除这些资源上移出对象的所有权,以便我们安全,那么为什么在“vector_base b " 析构函数无论如何都会在交换完成后释放内存?
我理解在必须调用析构函数的情况下需要显式调用它,因为我们有一些要破坏的东西(例如删除元素),但是在 std::move + vector_base 的释放之后我看不到它的含义。我在网上阅读了一些文本,我看到从对象的析构函数调用作为一个信号(对谁或什么?)对象的生命周期已经结束。
请向我澄清析构函数还有哪些有意义的工作要做?谢谢!
下面的代码片段来自这里http://www.stroustrup.com/4th_printing3.html
c++ - 正确使用placement-new和显式析构函数调用
在最近的一次采访中,我被要求回答这段代码是否安全,以及我何时会使用这样的代码:
我的回答是:这段代码是安全的,如果我需要通过调用它的析构函数来释放我的“对象”使用的资源,我会使用这种技术,但同时我不想释放我的“对象”并且想要它在内存中保存它的位置(通过在这里放置 new 来实现)。
老实说,我并不是在寻求帮助来在面试中正确回答这个问题。我只是好奇我对放置 new 和显式析构函数调用的理解是否正确。
static-constructor - 如何在 C# 中调用静态类的析构函数?
嗨,我是 OOPS 的初学者,请帮助我理解这一点
如何调用静态类的贬损者?或者如何为静态类、方法和对象释放内存?
c++ - 在“this”指针上使用placement new 是否安全
当前实施
我有一个包含unique_ptr
相互依赖的字段的类:
用例
这里的用例是我想将新值重新分配给指针,同时将其保留ResourceManager
为堆栈分配的变量或非指针类成员。
使用我当前的设置,我想像这样使用它:
这甚至是一个问题的原因是因为 B 和 C 是不可分配的(例如文件流)
丑陋的替代品
另一种更丑陋(也很危险)的方法是以相反的顺序reset
显式地显式关键字unique_ptr
段(请记住,C 依赖于 B,因此必须首先销毁),有效地模仿默认的销毁行为。
请注意,错误的实现是简单地将默认赋值运算符用于ResourceManager
. 这将按顺序分配字段,这意味着按顺序销毁unique_ptr
s,而我们需要逆序销毁。
问题
这种使用this
带有放置new
和显式析构函数调用的指针是否安全?
我必须使用返回的new_this
指针而不是原始this
指针(例如,如果this
在调用析构函数后指针在技术上变得无效)?
有没有更好的建议方法来实现这一目标?如果在类中添加更多这样unique_ptr
的字段,我必须确保将副本添加到赋值运算符。例如,是否可以改为调用移动构造函数,如下所示: