问题标签 [destruction]

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 投票
2 回答
107 浏览

c++ - 处理堆栈上的对象销毁

我目前正在为有关该主题的个人教育编写编译器前端,并且遇到了一个关于我通过运算符重载在 C++ 中处理 BNF 定义的方式的问题。

目前我的设置如下:

规则.h:

规则.cpp:

ChainRule、OrRule、KleeneRule、OptionalRule 和 EmptyRule 的定义很简单,如下所示:

Rule 的每个子类显然都定义了 parse() 的合理实现。使用这些类,我可以如下定义我的语法:

现在问题来了:每个重载的运算符按值返回一个新对象。这意味着每当我使用 operator>> 或 operator| 从 Rule 类中,一旦我从对 operator>> 或 operator| 的调用返回,这些指针将是垃圾。因为堆栈已被清理并且对象已经消失。

我也不能在我的 Rule 子类的构造函数中使用按值传递,因为这不允许我定义递归语法。

所以我没有按值传递对象的选项,也没有按指针传递对象的选项。谁能指出一个不会强迫我像这样定义我的语法的解决方案?

PS 我知道各种解析器生成器和 Boost.Spirit,但我的目标是编写自己的解析器。

0 投票
3 回答
268 浏览

c++ - 具有静态成员的类在 C++ 中包含静态成员

我有一个包含静态成员'obj'的类。静态类成员 obj 本身包含一个静态成员(恰好是类的互斥类型)。

现在,当我的程序终止时,它会崩溃。当静态对象“obj”被破坏时,就会发生这种情况。'obj' 的析构函数调用它的静态成员(我自己的互斥锁类型遵循 RAII 惯用语来破坏底层的低级对象)。不幸的是,这个成员碰巧已经被销毁,因为静态对象的初始化顺序(-> 相反的析构函数顺序)是未定义的。

如何干净地生存下来?我很惊讶这种情况并没有更频繁地发生。一般来说,拥有静态的非 POD 成员似乎非常危险。特别是如果您不了解它们的内部结构。

0 投票
1 回答
167 浏览

c++ - 混合语言 F77/C++:避免​​破坏 C++ 实例

我需要将 Fortran 和 C++ 混合在一起。我已经编写了 C++ 类。由于调用 C++ 库的 extern "C" 函数,我能够调用 C++ 公共函数。

此函数创建此 C++ 类的一些实例。当这个函数结束时,我想把这些实例保存在内存中以便之后调用它们。但是销毁我的实例是自动调用的。

我不想将这些实例与 Fortran 一起使用,而是在其他包装的 C++ 函数中使用它们。我不能使用 iso_c_binding 或任何 Fortran 2003 函数(很遗憾)。

您有什么简单的想法可以将实例保存在内存中吗?

提前致谢。

0 投票
1 回答
75 浏览

c++ - 矢量没有正确擦除内容(复制分配运算符的无限量运行直到崩溃 [BEX])?

好吧,我的问题是,在我想“卸载”加载的 DLL 之后,复制分配运算符被无限次调用,直到崩溃。

我从中删除矢量数据的代码如下所示:

但是“[DBG]UnloadPlugins()::Done”永远不会被打印出来。

这是我的复制分配运算符:

所以日志看起来像:

问题可能是什么?

0 投票
1 回答
405 浏览

c++ - 从非托管 c++ 显式调用托管析构函数

我有一个本机 C++ 项目,它通过包装类使用 .NET 图表实用程序。包装类的精简版是这样的;

一个函数将负责通过包装器实例化、操作和删除图表;

在程序实例期间有可能创建数百个图表。我在完成后通过调用显式删除每个包装器delete,但托管对象ManagedChartClass仅在程序退出时被破坏。这会导致不需要的内存堆积,并且出现“内存不足”异常。

当包装器被破坏时,如何确保托管对象被破坏?

0 投票
2 回答
283 浏览

java - Java垃圾收集和C++对象销毁有什么区别?

我在某处读到垃圾收集不像破坏(在 C++ 意义上)。它们有何不同?

0 投票
1 回答
148 浏览

java - java游戏中物体的破坏

我的 java 游戏中有对象奖励。当物件英雄接触到物件加成时,物件加成必须被销毁,从屏幕上消失,不占用内存。怎么做?

在此先感谢您的帮助。

0 投票
2 回答
3604 浏览

c++ - 在命名空间中初始化 const 对象

我在初始化命名空间中的一些 const 对象时遇到了问题。我有一个如下命名空间:

如果我调试初始化,我可以看到两者HIBYE获得字符串文字。继续执行到 initialziae HI_AND_BYE,但是当我们进入createHiAndByeVector()函数时,两者HIBYE没有值了。push_back()然后我在该方法中遇到分段错误。如果我查看调用堆栈,我会看到以下行:__static_initialization_and_destruction_0(). 到底是怎么回事?我的对象在构建后会立即被销毁吗?

0 投票
3 回答
116 浏览

c++ - 显式调用析构函数的行为

的定义some_class是:

当一个对象的生命周期结束时,它的销毁是:(1)调用它的析构函数和(2)按照它们在类定义中声明的顺序(=内存中的位置)销毁它的子对象。

但是,如果我有这样的事情:

步骤(2)也实现了?我的意思是,在第 X 行中,子对象的析构函数是否也被调用或仅在some_class析构函数的主体中执行?

0 投票
1 回答
683 浏览

functional-programming - 方案环境中的破坏性操作

我对 Scheme 中的破坏性操作感到困惑。假设我在全局环境中定义了一个列表和一些破坏性程序:

然后我们有以下表达式评估:

为什么两者兼有时对其程序外没有set!影响?为什么第一行的表达式不计算为?这一切究竟是如何运作的?aset-car!set-cdr!(mutated)