问题标签 [object-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.
java - 在java中删除一个类对象
我有一个名为Point
如下的类:
我有一个来自此类的对象,命名p
如下:
我想删除这个对象,我搜索了怎么做,我找到的唯一解决方案是:
但是Point的finalize方法在我做完之后就不起作用了。我能做些什么?
delphi - 尝试释放 FSQL (TStringList) 时的 Delphi XE3 无效指针
我正在 XE3 中创建一个新应用程序,但使用在 D2007 中创建的一些单元。
释放 TStringList 数据项时出现错误。这是创建数据项 FSQL 的代码:
这是收到错误的代码:
错误发生在“FreeAndNil(FSQL);”上。我尝试了“FSQL.Free”,得到了相同的结果。
这是我得到的错误:
项目:PayorUpdate.exe 引发异常类 EInvalidPointer,并带有消息“无效的指针操作。
当我打破蓝色箭头(调试模式)指向 _FreeMem(Pointer(Self)); 在 System 单元中的过程 TObject.FreeInstance 中如下:
如果我不释放 TStringList 数据项,我会在应用程序中出现内存泄漏。
我可能需要设置一个配置选项吗?我用谷歌搜索,除了以下三种可能性之一之外,没有找到任何解释我做错了什么的东西:
- 它是由其他一些内存管理器分配的。
- 它之前已经被释放过一次。
- 它从来没有被任何东西分配过。
如果我尝试...除了...我能够解决这个问题,但我不想这样做。
顺便说一句,我在不同的单元中有另一个 TStringList 并且我创建了 FreeAndNil 并且我没有收到任何错误。
这是完整的来源:
c++ - 是否可以提前销毁对象,使其存储内存被后续对象重用?
C++:可以提前销毁对象,使其存储内存被后续对象重用吗?
在一段 C++ 代码中,在前半部分,使用了对象 a、b;在第二半部分,对象 c、d 被创建和使用。
由于对象 a、b 占用大量内存,我想在第一半部分完成时手动销毁对象 a、b。
我知道我可以使用 new,delete 来实现它。
但是如果我不使用 new 并且仍然想更早地销毁对象(也就是说,在其范围结束之前),我可以手动调用它的析构函数来销毁它吗?这样那部分内存就可以被对象 c 和 d 重用。(我不需要释放内存,因为重用很好。
这是一个伪代码:
[更新 1] 所以大多数人建议使用范围,这是一个好方法。我还是很好奇,我可以在那里使用 ~a 和 ~b 吗?我认为这似乎也是一种可行且方便的方式。
[更新 2] 我想出了另一种情况。在这种情况下,不同变量的作用域是交织在一起的!就像这样:a 的范围与 b 的范围有重叠,但它们不包括关系。它是部分重叠的关系。在这种情况下,这是否意味着无法使用范围?最后的手段是使用new和delete,对吧?
c++ - C ++级联破坏具有静态存储持续时间的对象
这个链接说关于具有静态存储持续时间的对象的级联破坏是 C++ 中流行的未定义行为。究竟是什么?我无法理解。如果用一个可以演示的简单C++程序来解释会更好。非常感谢您的帮助。谢谢
c++ - 在容器中使用新位置
我刚刚在 C++ 中遇到了一些容器实现。该类使用内部缓冲区来管理其对象。这是一个没有安全检查的简化版本:
AFAIK ,如果/未自定义,这将E
冗余地构造/破坏对象。这似乎很危险。Container()
~Container()
new
delete
new
是否以最佳方式使用放置Add()
来防止危险的冗余构造函数/析构函数调用(除了将类绑定到功能齐全的池)?
使用放置new
时,new char[sizeof(E)*100]
分配缓冲区的正确方法是什么?
c++ - C++中的对象创建和销毁顺序
我编写了一个简单的程序来了解更多关于在 C++ 中创建和销毁对象的顺序(使用 Visual Studio 2015)。这里是:
输出让我有点吃惊(a1
s):
为了了解更多关于正在发生的事情,我添加了有关对象实例的信息:
结果更令人惊讶:
即,为什么a1
构造函数只调用一次,而析构函数调用了3 次?我是a
按值传递的,所以显然至少创建了 1 个临时对象,但请向我解释创建和销毁实例的时间和数量? A
c++ - 参数的销毁是否在返回之前发生?
好的,我有以下事件序列:
- 我构造了一个右值对象
- 我将一个迭代器传递给那个右值对象到一个函数中作为参数
- 该函数在此迭代器上运行
- 该函数按值返回此迭代器
- 我取消引用迭代器
我不知道是什么原因导致清理 r 值对象,是该行的终止吗?
好的,现在具体来说,我试图为这个问题想出一个更好的答案:C++ 中的字符串乘法我有代码:
所以我想知道什么时候应该销毁string
内部构造的。generate_n
顺便说一句,这似乎在 gcc 5.1 上运行良好:http: //ideone.com/Y8rDs5但我可能只是得到未定义的行为。Visual Studio 2015 上的代码段错误这一事实暗示了这一点。
c++ - 如何从对象的指针中清空 std::set?
我在清空我的集合时遇到问题,所以我有 3 个这样
的类:A 类,以及 2 个继承的 B 和 C 类。在代码中,我将 3 种类型的元素存储在集合中,集合是:
所以每当我创建一个 B 元素时,我都会这样做:
所以问题来了,每当我想擦除一个元素,甚至结束程序(调用析构函数)时,我不知道应该在析构函数中输入什么,我有这样的:
我也试过把delete *to_delete;
上面的objects.erase
,也试过把它单独放在一边,试着把擦除单独放在没有delete
,但事情是我用过new
,所以我应该在delete
某个地方使用。一切都不起作用,程序只是崩溃了,我试着让 D'tor 为空,程序可以工作,但是我有很多内存泄漏,我已经检查过了。
请帮帮我,我坚持这件事。非常感谢<3
文件:
除了 Destructor 和 removeRoom 函数(基本上哪里是 delete.. 还有 operator<< 无法正常工作,但我相信这是因为那件事,我再次拥有virtual ~EscapeRoomWrapper();
c++ - C++ 销毁顺序:在类析构函数之前调用字段析构函数
有没有办法在类析构函数之前调用字段析构函数?
假设我有 2 个类Small
和Big
, 并Big
包含一个实例Small
作为其字段:
当然,这会在小析构函数之前调用大析构函数:
我需要在Small
析构函数之前调用Big
析构函数,因为它为Big
析构函数做了一些必要的清理。
我可以:
- 显式调用
small.~Small()
析构函数。-> 然而,这会调用Small
析构函数两次:一次是显式调用,一次是在Big
析构函数执行后调用。 - 将a
Small*
作为字段并调用析构函数delete small;
Big
我知道我可以在Small
类中有一个函数来进行清理并在Big
析构函数中调用它,但我想知道是否有办法反转析构函数的顺序。
有没有更好的方法来做到这一点?
delphi - 控件销毁后如何防止消息处理
以下组件类型有两个实例:
TfrmTimeSliceStructure
,它是 的直系后代TFrame
。THKSDBVirtualStringTree
,它是TDBVirtualStringTree
(来自 FIBPlus)的直系后代,它本身是 Mike LischkeTVirtualStringTree
类的直系后代。
该THKSDBVirtualStringTree
组件用作 上的子控件TfrmTimeSliceStructure
。
双击 - 在某些条件下 - 框架将被破坏。
为此,我PostMessage
使用自定义消息代码WM_USER + 4
(这是十六进制$0404
)进行调用,以便延迟销毁,直到所有当前消息都被完全处理。
但是,在许多情况下会发生访问冲突,因为THKSDBVirtualStringTree
组件在自身销毁后仍在处理消息。
我预计在控件销毁后不会发生消息处理。
如何防止消息被已销毁的控件处理?
下面,您可以看到调试器的输出。在这两个类中,我在方法中添加了一条消息记录,WndProc
以输出收到的消息代码。在第一行中,可以看到我的自定义消息代码WM_USER + 4
已收到。
几行之后,有两行Instance of class THKSDBVirtualStringTree is going to be destroyed.
和Instance of class THKSDBVirtualStringTree has been destroyed.
。在这两行之间,没有收到任何消息。
在这些行之后,仍然处理了一些消息。最终,这会导致最后的访问冲突。从他们的消息代码中我可以看到,这些消息是控制消息,因为CM_BASE = $B000;
.