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

简介: 数组作为函数返回值时,非常容易引起内存泄露。问题现象: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;

相关文章
|
1月前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
33 0
|
19天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
22天前
|
编译器 C语言
字符串与内存函数
字符串与内存函数
26 0
|
5天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
13 2
|
8天前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
16 0
|
8天前
|
存储 编译器 C++
【C++】内存管理和模板基础(new、delete、类及函数模板)
【C++】内存管理和模板基础(new、delete、类及函数模板)
22 1
|
8天前
|
编译器 C语言 C++
详解内存操作函数
详解内存操作函数
|
12天前
3.默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4.内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5生命周期不一样(了解)
3.默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4.内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5生命周期不一样(了解)
17 0
|
15天前
|
存储 机器学习/深度学习 Java
【Java探索之旅】数组使用 初探JVM内存布局
【Java探索之旅】数组使用 初探JVM内存布局
26 0
|
1月前
|
编译器 C++
C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。
138 1