谨防数组函数返回值造成的内存泄露

简介: 数组作为函数返回值时,非常容易引起内存泄露。问题现象:Build应用程序后,提示非法内存访问;可是Compile应用程序却没有这个问题。问题思考:函数返回值,在被调用函数中负责释放;局部变量也是在函数调用结束后在函数内被释放。

数组作为函数返回值时,非常容易引起内存泄露。

问题现象:Build应用程序后,提示非法内存访问;可是Compile应用程序却没有这个问题。

问题思考:函数返回值,在被调用函数中负责释放;局部变量也是在函数调用结束后在函数内被释放。如果一个函数调用了另外一个函数,却没有使用被调用函数的返回值,就有可能造成内存泄露。

 

//数组作为函数返回值

function StrToPByte(Const str: string;Var arrByte: array of byte): PByte;
var
  i: integer;
begin
  for i := 0 to Length(str) do
  begin
    arrByte[i] := Byte(Char(str[i + 1]));
  end;

  Result := @arrByte;
end;

 

//错误用法

procedure Test;

var

  arrTest: array[0..15] of byte;

  str: string;

begin

  str := '1239582692918232';

  StrToPByte(str, arrText);  

end;

 

//正确用法(用局部变量引用,才能保证被Delphi释放)

procedure Test;

var

  arrTest: array[0..15] of byte;

  pTest: PByte;

  str: string;

begin

  str := '1239582692918232';

  pTest := StrToPByte(str, arrText);  

end;

相关文章
|
3月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
45 3
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
68 6
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
3月前
|
Rust 安全 Java
内存数组越界
【10月更文挑战第14天】
38 1
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
3月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
517 1
|
3月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
46 0
|
3月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
52 0