用 4D 编写的内存泄漏示例

Tim*_*ner 2 memory-leaks out-of-memory 4d-database

有哪些使用 4D 编程语言编写的开发人员创建的内存泄漏示例?

由开发人员创建的内存泄漏,我指的是由糟糕的编程造成的内存泄漏,而这种泄漏本来可以通过更好的编程来避免。


32位

在 32 位应用程序中运行时,一旦尝试分配超过 2^32 字节 (4 GB) 的内存,它最终会崩溃。如果在 Mac OS X 平台上,崩溃报告的底部VM Region Summary应该显示大约 3.7 GB 的内存值:

总计 3.7G


64位

当在 64 位应用程序中运行时,代码将继续增加分配的内存量并且不会停滞不前,在这种情况下,操作系统最终会抱怨内存不足: 伊格

Tim*_*ner 5

概述

开发人员可以通过多种方式创建自己的内存泄漏。您想要避免的大部分内容都列在此处

  • 使用CLEAR VARIABLE变量完成时使用
  • 使用CLEAR SET一组完成后使用
  • 使用CLEAR NAMED SELECTION命名选择完成后使用
  • 使用CLEAR LIST列表完成后使用
  • SET BLOB SIZE使用 BLOB 或使用完成后,将 BLOB的大小重新调整为 0CLEAR VARIABLE
  • 使用数组或使用完成后重新大小的阵列0CLEAR VARIABLE 不要忘记关闭所有打开的XML树,如XMLDOMSVG,等(DOM CLOSE XMLSVG_CLEAR
  • 如果使用ODBC总是记得释放连接使用ODBC_SQLFreeConnect
  • 确保清理任何使用的屏幕外区域

例子

以下是开发人员创建的内存泄漏的两个具体示例:

忘记关闭 XML

错误代码:

Repeat 
  $xmlRef:=DOM Create XML Ref("root")
Until (<>crashed_or_quit)
Run Code Online (Sandbox Code Playgroud)

上面的代码片段会泄漏内存,因为每次调用DOM CREATE XML REF都会创建一个对内存位置的新引用,而此代码的开发人员忽略了释放内存的调用。在 32 位主机应用程序中循环运行它最终会导致崩溃。

固定代码:

DOM CLOSE XML在完成 XML 引用后,可以通过调用轻松修复此代码。

Repeat 
  $xmlRef:=DOM Create XML Ref("root")   
  DOM CLOSE XML($xmlRef)  
Until (<>crashed_or_quit)  
Run Code Online (Sandbox Code Playgroud)

忘记清除列表

错误代码:

Repeat 
   $listRef:=New list
Until (<>crashed_or_quit)
Run Code Online (Sandbox Code Playgroud)

上面的代码片段会泄漏内存,因为每次NEW LIST调用都会返回对内存中新位置的引用。开发人员应该使用该CLEAR LIST($listRef)命令清除引用位置的内存。作为奖励,如果列表附加了任何子列表,则可以通过传递*类似参数来清除子列表CLEAR LIST($listRef;*)

固定代码:

这可以通过调用轻松修复,CLEAR LIST($listRef;*)如下面的固定示例所示:

Repeat 
   $listRef:=New list
   CLEAR LIST($listRef;*)
Until (<>crashed_or_quit)
Run Code Online (Sandbox Code Playgroud)