谨防动态数组越界造成的内存泄露

在Delphi中,静态数组,编译器会自动检测下标是否越界,动态数组,不会自动检测。

注意:delphi中数组的下标索引是从0开始的,也就是说,如果数组长度为2,则下标索引分别为0,1

 

procedure TestArray;

var

  arr1: array[0..2] of byte; //静态数组

  arr2: array of byte;//动态数组

begin

  //静态数组

  arr1[0] := 1;

  arr1[1] := 2;

  arr1[2] := 3;

  arr1[3] := 4; //这一行不能编译通过,会提示下标越界

 

  //动态数组

  SetLength(arr2, 3);

  arr2[0] := 1;

  arr2[1] := 2;

  arr2[2] := 3;

  arr2[3] := 4; //这一行能编译通过,但是已经造成了内存泄露,要谨防这样使用

end;

时间: 2024-08-30 20:07:31

谨防动态数组越界造成的内存泄露的相关文章

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

数组作为函数返回值时,非常容易引起内存泄露. 问题现象:Build应用程序后,提示非法内存访问:可是Compile应用程序却没有这个问题. 问题思考:函数返回值,在被调用函数中负责释放:局部变量也是在函数调用结束后在函数内被释放.如果一个函数调用了另外一个函数,却没有使用被调用函数的返回值,就有可能造成内存泄露.   //数组作为函数返回值 function StrToPByte(Const str: string;Var arrByte: array of byte): PByte;var 

数组越界 内存泄露-指针或数组越界实在找不到问题了

问题描述 指针或数组越界实在找不到问题了 http://wenku.baidu.com/link?url=e_SMeDv5empBQO07OE4vnfFpYDsc_nZ61H-j6OoSTbwN8J24IgKdxnTHnHk51sKnRx0IbujnnQepn-Ml5_l6n3XJGomwgwt6zxoIdF2E32i 实验五,要交OJ,OJ上题目略有不同. 输入有以下四种情况: 当输入大写英文字母'T'时,表示下一行是文本内容,包含若干英文单词.标点符号以及阿拉伯数字,用于构建二叉查找树.文本

C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪。

问题描述 C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪. 今天写了个样例程序,程序主要是动态创建一个类的对象,存入list链表中,然后再把链表中的对象delete掉回收内存,理论上并不应该会产生内存泄露,但是从现象上来看确实是发生了内存泄露.程序启动后我分别在"创建对象前"."创建对象后"."释放对象内存后"三个阶段使用命令ps -aux|grep a.out查看了程序使用内存情况,发现在"释放对象内存后&

《从缺陷中学习C/C++》——6.12 二维数组的内存泄露

6.12 二维数组的内存泄露 从缺陷中学习C/C++代码示例 int main() { int **pVal = new int* [2]; for(int i = 0; i < 2;i++){ pVal[i] = new int[3]; } delete [] pVal; return 0; } 现象&结果二维数组的释放,没有将每个元素逐一释放,造成内存泄露.使用valgrind检测工具检测,可以得到类似的信息,LEAK SUMMARY: definitely lost: 24 bytes

如何处理JavaScript内存泄露

几周前,我们开始写一个系列,深入探讨JavaScript和它的工作原理.我们认为了解JavaScript的构成以及它们如何协作,有助于编写出更好的代码和应用程序. 本系列第一篇重点介绍了引擎.运行时.调用栈.第二篇揭示了谷歌V8 JavaScript引擎的内部机制,并且提供了一些关于如何写出更好的JavaScript代码的建议. 本文作为第三篇,将会讨论另一个开发者容易忽视的重要主题 :内存管理.我们也会提供一些关于如何处理JavaScript内存泄露的技巧.在SessionStack,我们需要

c linux sprintf-c sprintf函数第一个参数可以使动态数组吗?

问题描述 c sprintf函数第一个参数可以使动态数组吗? string str="1234.56"; char *ch = new char[str.length()+1]; double tude = atof(str.c_str()); sprintf(ch, "%.5f", tude); 这样格式化double的变量,在内存的读取上存在问题吗? 解决方案 会有问题 因数浮点数精度的问题,可能格式出来需要的空间比原始的字符串空间要大.所以,会出来内存访问越界

浅谈Java编程中的内存泄露情况_java

必须先要了解的 1.c/c++是程序员自己管理内存,Java内存是由GC自动回收的. 我虽然不是很熟悉C++,不过这个应该没有犯常识性错误吧. 2.什么是内存泄露? 内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃. 在C/C++中分配了内存不释放的情况就是内存泄露. 3.Java存在内存泄露 我们必须先承认这个,才可以接着讨论.虽然Java存在内存泄露,但是基本上不用很关心它,特别是那些对代码本身就不讲究的就更不要去关心这个了. Java中的内存泄露当然是指:存在无用但是垃

关于c语言内存分配,malloc,free,和段错误,内存泄露

1.   C语言的函数malloc和free  (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数        void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL.        void  free(void *ptr) 释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptr为NULL,

各位大神,传递图片问题,学长说是数组越界,不知道怎么解决

问题描述 各位大神,传递图片问题,学长说是数组越界,不知道怎么解决 图片传递代码图片接收代码 解决方案 不是内存溢出,而是有变量为null 解决方案二: 我觉得你的学长判断是错误的,因为错误消息已经写了:NullPointerException,这个异常消息的含义就是说有空对象调用了方法.所以不会是内存溢出(不完全排除,但可能性很小),而你所指出的那行代码上有一个空对象调用了方法. 我看过你的代码,你箭头所指向的代码一共有4个对象调用了方法,其中intent对象已经看到了你new的代码,所以它不