问题标签 [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.
c++ - 处理堆栈上的对象销毁
我目前正在为有关该主题的个人教育编写编译器前端,并且遇到了一个关于我通过运算符重载在 C++ 中处理 BNF 定义的方式的问题。
目前我的设置如下:
规则.h:
规则.cpp:
ChainRule、OrRule、KleeneRule、OptionalRule 和 EmptyRule 的定义很简单,如下所示:
Rule 的每个子类显然都定义了 parse() 的合理实现。使用这些类,我可以如下定义我的语法:
现在问题来了:每个重载的运算符按值返回一个新对象。这意味着每当我使用 operator>> 或 operator| 从 Rule 类中,一旦我从对 operator>> 或 operator| 的调用返回,这些指针将是垃圾。因为堆栈已被清理并且对象已经消失。
我也不能在我的 Rule 子类的构造函数中使用按值传递,因为这不允许我定义递归语法。
所以我没有按值传递对象的选项,也没有按指针传递对象的选项。谁能指出一个不会强迫我像这样定义我的语法的解决方案?
PS 我知道各种解析器生成器和 Boost.Spirit,但我的目标是编写自己的解析器。
c++ - 具有静态成员的类在 C++ 中包含静态成员
我有一个包含静态成员'obj'的类。静态类成员 obj 本身包含一个静态成员(恰好是类的互斥类型)。
现在,当我的程序终止时,它会崩溃。当静态对象“obj”被破坏时,就会发生这种情况。'obj' 的析构函数调用它的静态成员(我自己的互斥锁类型遵循 RAII 惯用语来破坏底层的低级对象)。不幸的是,这个成员碰巧已经被销毁,因为静态对象的初始化顺序(-> 相反的析构函数顺序)是未定义的。
如何干净地生存下来?我很惊讶这种情况并没有更频繁地发生。一般来说,拥有静态的非 POD 成员似乎非常危险。特别是如果您不了解它们的内部结构。
c++ - 混合语言 F77/C++:避免破坏 C++ 实例
我需要将 Fortran 和 C++ 混合在一起。我已经编写了 C++ 类。由于调用 C++ 库的 extern "C" 函数,我能够调用 C++ 公共函数。
此函数创建此 C++ 类的一些实例。当这个函数结束时,我想把这些实例保存在内存中以便之后调用它们。但是销毁我的实例是自动调用的。
我不想将这些实例与 Fortran 一起使用,而是在其他包装的 C++ 函数中使用它们。我不能使用 iso_c_binding 或任何 Fortran 2003 函数(很遗憾)。
您有什么简单的想法可以将实例保存在内存中吗?
提前致谢。
c++ - 矢量没有正确擦除内容(复制分配运算符的无限量运行直到崩溃 [BEX])?
好吧,我的问题是,在我想“卸载”加载的 DLL 之后,复制分配运算符被无限次调用,直到崩溃。
我从中删除矢量数据的代码如下所示:
但是“[DBG]UnloadPlugins()::Done”永远不会被打印出来。
这是我的复制分配运算符:
所以日志看起来像:
问题可能是什么?
c++ - 从非托管 c++ 显式调用托管析构函数
我有一个本机 C++ 项目,它通过包装类使用 .NET 图表实用程序。包装类的精简版是这样的;
一个函数将负责通过包装器实例化、操作和删除图表;
在程序实例期间有可能创建数百个图表。我在完成后通过调用显式删除每个包装器delete
,但托管对象ManagedChartClass
仅在程序退出时被破坏。这会导致不需要的内存堆积,并且出现“内存不足”异常。
当包装器被破坏时,如何确保托管对象被破坏?
java - Java垃圾收集和C++对象销毁有什么区别?
我在某处读到垃圾收集不像破坏(在 C++ 意义上)。它们有何不同?
java - java游戏中物体的破坏
我的 java 游戏中有对象奖励。当物件英雄接触到物件加成时,物件加成必须被销毁,从屏幕上消失,不占用内存。怎么做?
在此先感谢您的帮助。
c++ - 在命名空间中初始化 const 对象
我在初始化命名空间中的一些 const 对象时遇到了问题。我有一个如下命名空间:
如果我调试初始化,我可以看到两者HI
并BYE
获得字符串文字。继续执行到 initialziae HI_AND_BYE
,但是当我们进入createHiAndByeVector()
函数时,两者HI
都BYE
没有值了。push_back()
然后我在该方法中遇到分段错误。如果我查看调用堆栈,我会看到以下行:__static_initialization_and_destruction_0()
. 到底是怎么回事?我的对象在构建后会立即被销毁吗?
c++ - 显式调用析构函数的行为
的定义some_class
是:
当一个对象的生命周期结束时,它的销毁是:(1)调用它的析构函数和(2)按照它们在类定义中声明的顺序(=内存中的位置)销毁它的子对象。
但是,如果我有这样的事情:
步骤(2)也实现了?我的意思是,在第 X 行中,子对象的析构函数是否也被调用或仅在some_class
析构函数的主体中执行?
functional-programming - 方案环境中的破坏性操作
我对 Scheme 中的破坏性操作感到困惑。假设我在全局环境中定义了一个列表和一些破坏性程序:
然后我们有以下表达式评估:
为什么两者兼有时对其程序外没有set!
影响?为什么第一行的表达式不计算为?这一切究竟是如何运作的?a
set-car!
set-cdr!
(mutated)