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

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

问题现象: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;

时间: 2024-12-28 03:41:06

谨防数组函数返回值造成的内存泄露的相关文章

c++函数返回值是数组问题

问题描述 c++函数返回值是数组问题 比如现在要求定义一个函数fun(),在主函数调用时直接用fun():就能输出在fun函数里定义好的一个字符串,那要fun函数的返回值怎么返回才行,为什么我返回指针但打印出来却不是正确结果?求大神解释 解决方案 一般来说,出于内存管理的需要,让主程序来分配内存,传指针.比如scanf函数,就是通过这个方式输入值. 比如 void getstr(char * buffer) { char str[] = "hello world"; strcpy(bu

调用函数-怎样将二维数组作为函数返回值并在主函数中调用

问题描述 怎样将二维数组作为函数返回值并在主函数中调用 我的调用函数是这样的:float(*TIME(float f_1[3][100]))[100]{ for(i=0;i<=2;i++) { L_1[i][0]=-(a_1*f_1[i][0-3+100]+a_2*f_1[i][0-2+100]+a_3*f_1[i][0-1+100]+a_4*f_1[i][0]+a_5*f_1[i][0+1]+a_6*f_1[i][0+2]); L_1[i][1]=-(a_1*f_1[i][1-3+100]+a

C语言 用指针作为函数返回值详解_C 语言

C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> #include <string.h> char *strlong(char *str1, char *str2){ if(strlen(str1) >= strlen(str2)){ return str1; }else{ return str2; } } int main(){ cha

c++-在写函数时 是不是要把返回值都放在形参表里?把函数返回值设定为true/false?

问题描述 在写函数时 是不是要把返回值都放在形参表里?把函数返回值设定为true/false? 在写函数时 是不是要把返回值都放在形参表里?把函数返回值设定为true/false? 解决方案 主要还是看程序需要把,这种想法只是对于一些内存申请操作来说,函数在结束后就将函数内申请的控件释放.如果已经在外部申请好了内存,是可以当做返回值返回的.所以说并不一定就要把返回值放在形参表里. 解决方案二: 这也是一种方式,尤其对于要返回多个结果的时候,一般通过参数来传递结果.然后函数返回值来表示函数是否调用

函数返回值是否使用引用类型的问题:理解引用、返回值

在<对象更有用的玻璃罩--常引用>一文中,介绍了对象作为函数的参数时,推荐使用引用的形式.并且,如果实际参数的值不允许改变时,声明为常引用更佳. 在<第8周-任务1-方案3-复数类中运算符重载(与实数运算)>中,又讨论了一个问题,结论是:在类似复数加法运算符重载这样的函数,形式参数用作为常引用最佳,如: friend Complex operator + (const Complex &c, const double &d); friend Complex oper

《C++面向对象高效编程(第2版)》——3.15 函数返回值

3.15 函数返回值 C++面向对象高效编程(第2版)许多函数向主调函数返回值.引用或指针.要正确和高效地使用它们,必须先理解它们的含义.可能有以下几种模式返回: T X::f(); // 按值返回T T* X::f(); // 返回T类对象的指针/地址 const T* X::f(); // 返回指向const T类对象的指针 T& X::f(); // 返回对T对象的引用 const T& X::f(); // 返回对const T类对象的引用``` (1)绝不返回对局部变量的引用(或

Python函数返回值实例分析

  本文实例讲述了Python的函数返回值用法.分享给大家供大家参考.具体分析如下: 最近学一些Python的基本用法,看到定义函数,发现似乎只能返回一个返回值,想想matlab里返回多个返回值多方便啊,网上查了查,看到有返回多个值的方法. python 函数返回值有两种形式: 1 返回一个值. 2 返回多个值. 现看看返回一个值的吧. ? 1 2 3 4 def firstvalue(a,b): c = a + b return c print firstvalue(1,2) #结果:3 再看

Shell中函数返回值超出问题

  这篇文章主要介绍了Shell中函数返回值超出问题,shell中通过return返回是有限制的,最大返回255,超过255,则从0开始计算,需要的朋友可以参考下 1.前言 快半年没有写博客了,荒废了很久,工作中的杂事太多,自己越来越懒了.为了鞭策自己成长,还是要坚持写写博客,记录自己的成长. 2.shell函数介绍 语法: 代码如下: [ function ] funname [()] { action; [return int;] } 说明: (1)可以带function fun() 定义,

函数返回值的检查方法----历史遗留问题?

问题描述 网上众多的源码,在创建事件或者创建线程之后,会将其句柄与INVALID_HANDLE_VALUE进行比较,检查函数的执行是否成功,如下所示:m_hExitEvt=CreateEvent(NULL,FALSE,FALSE,NULL);if(m_hExitEvt==INVALID_HANDLE_VALUE){returnFALSE;}问题出现了:在d:ProgramFilesMicrosoftVisualStudio.NET2003vc7PlatformSDKincludepdh.h和d: