动态数组上的无效指针操作免费
Invalid Pointer Operation on dynamic array free
我是 Delphi 的新手,请多多关照。
我正在开发一款允许用户自定义其界面(按钮位置、外观、wtv)和其他一些东西的软件。
问题是,我有一个网格,我将其单元格的表示存储在布尔动态数组中,该数组表示哪些单元格被占用。但是当我尝试释放那个矩阵时 Sometimes 我得到一个无效的指针操作。有时没有任何错误,但有时我得到无效指针的东西。
定义:
type
TMatrix = array of array of Boolean;
var
Matrix: TMatrix;
初始化:
SetLength(Matrix, MyGrid.ColumnCollection.Count, MyGrid.RowCollection.Count);
用法:
大多数情况下,这些类型的操作是我唯一用于矩阵的操作,而且我确信那些变量 col、row、colspan、rowspan 的值永远不会大于数组边界
//Checks if a set of cells are occupied
for i := column to (column + columnspan)-1 do
begin
for j := row to (row + rowspan)-1 do
begin
if Matrix[i, j] then
begin
valido := False;
end;
end;
end;
// if there isnt any cell occupied i can move a component to that location and i set the cells to true ( occupied)
if (valido) then
begin
for i := column to (column + colspan)-1 do
begin
for j := row to (row + rowspan)-1 do
begin
Matrix[i,j]:= True;
end;
end;
end
免费:
try
begin
SetLength(Matrix,0,0);
end;
except
on E : Exception do
begin
//todo
ShowMessage('Free: ' + E.Message);
end;
end;
我正在使用 FASTMM4,我收到了内存泄漏警告,但我无法理解其内容。
什么可能导致此错误?
我正在使用 Delphi Xe6 Firemonkey
任何帮助将不胜感激。
谢谢
对此最可能的解释是您在数组边界之外写入。我们没有足够的代码来确定是这种情况,但您报告的症状总是由越界访问引起的。
你的下一步是让编译器编写代码来检查我们的边界访问。在您的项目选项中,在编译器部分,找到 范围检查 选项。启用此选项。现在,无论何时访问数组,编译器都会发出代码来检查数组索引是否有效。如果您的代码未通过测试,则在运行时将引发异常。这将使您的代码的哪一部分有缺陷变得显而易见。
我是 Delphi 的新手,请多多关照。 我正在开发一款允许用户自定义其界面(按钮位置、外观、wtv)和其他一些东西的软件。 问题是,我有一个网格,我将其单元格的表示存储在布尔动态数组中,该数组表示哪些单元格被占用。但是当我尝试释放那个矩阵时 Sometimes 我得到一个无效的指针操作。有时没有任何错误,但有时我得到无效指针的东西。
定义:
type
TMatrix = array of array of Boolean;
var
Matrix: TMatrix;
初始化:
SetLength(Matrix, MyGrid.ColumnCollection.Count, MyGrid.RowCollection.Count);
用法: 大多数情况下,这些类型的操作是我唯一用于矩阵的操作,而且我确信那些变量 col、row、colspan、rowspan 的值永远不会大于数组边界
//Checks if a set of cells are occupied
for i := column to (column + columnspan)-1 do
begin
for j := row to (row + rowspan)-1 do
begin
if Matrix[i, j] then
begin
valido := False;
end;
end;
end;
// if there isnt any cell occupied i can move a component to that location and i set the cells to true ( occupied)
if (valido) then
begin
for i := column to (column + colspan)-1 do
begin
for j := row to (row + rowspan)-1 do
begin
Matrix[i,j]:= True;
end;
end;
end
免费:
try
begin
SetLength(Matrix,0,0);
end;
except
on E : Exception do
begin
//todo
ShowMessage('Free: ' + E.Message);
end;
end;
我正在使用 FASTMM4,我收到了内存泄漏警告,但我无法理解其内容。
什么可能导致此错误? 我正在使用 Delphi Xe6 Firemonkey 任何帮助将不胜感激。 谢谢
对此最可能的解释是您在数组边界之外写入。我们没有足够的代码来确定是这种情况,但您报告的症状总是由越界访问引起的。
你的下一步是让编译器编写代码来检查我们的边界访问。在您的项目选项中,在编译器部分,找到 范围检查 选项。启用此选项。现在,无论何时访问数组,编译器都会发出代码来检查数组索引是否有效。如果您的代码未通过测试,则在运行时将引发异常。这将使您的代码的哪一部分有缺陷变得显而易见。