问题标签 [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.

0 投票
4 回答
2075 浏览

c++ - 我们是否需要为分配有“新位置”的“简单 POD 类”显式调用析构函数?

这里的“简单”是指具有非虚拟空析构函数或 POD 类型的类。

典型例子:

如果我们不调用显式析构函数 on 会发生什么p?我不认为这是未定义的行为或内存泄漏。
重复使用有什么问题buffer吗?

0 投票
2 回答
725 浏览

c++ - 用作对象的封装字符数组是否违反了严格的别名规则

下面的类是否打破了严格的别名规则:

我对标准的解读是它是不正确的,但我不确定(我的用法是拥有一个对象数组T+这些对象的一些元数据,但是可以在不手动分配内存的情况下控制对象构造/解构)作为分配的对象被用作new标准中放置的示例。

0 投票
2 回答
447 浏览

c++ - 一个对象被销毁后,标量类型的子对象会发生什么?

renew考虑这段代码(对于和的不同值cleanse):

assert保证通过吗?

我知道推荐这种风格。像“这不是一个合理的做法”这样的观点在这里并不感兴趣。

我想要一个答案,显示标准报价的完整逻辑证明。编译器作者的意见也可能很有趣。

编辑:现在有两个问题!查看renew参数(使用renew == 0,这是原始问题)。

编辑2:我想我的问题真的是:什么是成员对象?

编辑 3:现在有了另一个cleanse参数!

0 投票
2 回答
490 浏览

c++ - 手动调用析构函数并重用内存

虽然我知道这可能不是最好的想法,但我假设性地问:

手动调用对象的析构函数,然后将内存重新用于另一个对象是否合法(即定义的行为)?

定义:

代码:

0 投票
1 回答
386 浏览

c++ - C++,类的空析构函数

我已经阅读了您的一个答案(“空”构造函数或析构函数会与生成的构造函数做同样的事情吗?)。您写道:“假设 C 类型的对象是在 .cpp 文件中 A 的构造函数的定义中创建的,该文件还包含 struct C 的定义。现在,如果您使用 struct A 并要求销毁 A 对象,编译器将提供析构函数的隐式定义,就像上面的情况一样。该析构函数还将隐式调用 auto_ptr 对象的析构函数。这将删除它持有的指向 C 对象的指针 - 不知道C 的定义!出现在 .cpp 文件中,其中定义了 struct A 的构造函数”。你能为我解释两件事吗:1.为什么A的析构函数应该知道C的定义?2. 添加A的空析构函数对定位有什么帮助?谢谢

0 投票
1 回答
226 浏览

c++ - 我什么时候应该防止隐式破坏?它是如何工作的?

我知道我可以声明一个析构函数=delete,或者private为了防止程序在范围末尾隐式删除对象。我也知道,如果它是私有的,我可以有一个成员函数,只要我调用它就可以显式调用析构函数:void kill() { this–>~A(); }

我的问题是:

  • 为什么我要防止隐式破坏?请举个例子

  • =delete做什么?它是否确保析构函数永远不会运行?那么该对象将永远存在于其范围之外吗?

0 投票
1 回答
20443 浏览

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

0 投票
3 回答
131 浏览

c++ - 正确使用placement-new和显式析构函数调用

在最近的一次采访中,我被要求回答这段代码是否安全,以及我何时会使用这样的代码:

我的回答是:这段代码是安全的,如果我需要通过调用它的析构函数来释放我的“对象”使用的资源,我会使用这种技术,但同时我不想释放我的“对象”并且想要它在内存中保存它的位置(通过在这里放置 new 来实现)。

老实说,我并不是在寻求帮助来在面试中正确回答这个问题。我只是好奇我对放置 new 和显式析构函数调用的理解是否正确。

0 投票
2 回答
98 浏览

static-constructor - 如何在 C# 中调用静态类的析构函数?

嗨,我是 OOPS 的初学者,请帮助我理解这一点

如何调用静态类的贬损者?或者如何为静态类、方法和对象释放内存?

0 投票
1 回答
767 浏览

c++ - 在“this”指针上使用placement new 是否安全

当前实施

我有一个包含unique_ptr相互依赖的字段的类:

用例

这里的用例是我想将新值重新分配给指针,同时将其保留ResourceManager为堆栈分配的变量或非指针类成员。

使用我当前的设置,我想像这样使用它:

这甚至是一个问题的原因是因为 B 和 C 是不可分配的(例如文件流)

丑陋的替代品

另一种更丑陋(也很危险)的方法是以相反的顺序reset显式地显式关键字unique_ptr段(请记住,C 依赖于 B,因此必须首先销毁),有效地模仿默认的销毁行为。

请注意,错误的实现是简单地将默认赋值运算符用于ResourceManager. 这将按顺序分配字段,这意味着按顺序销毁unique_ptrs,而我们需要逆序销毁。

问题

这种使用this带有放置new和显式析构函数调用的指针是否安全?

我必须使用返回的new_this指针而不是原始this指针(例如,如果this在调用析构函数后指针在技术上变得无效)?

有没有更好的建议方法来实现这一目标?如果在类中添加更多这样unique_ptr的字段,我必须确保将副本添加到赋值运算符。例如,是否可以改为调用移动构造函数,如下所示: