.net 表NewRow()导致内存泄漏

.net 表NewRow()导致内存泄漏,.net,memory-leaks,datatable,.net,Memory Leaks,Datatable,在调查内存泄漏时,我发现它是由多次对循环中的表调用NewRow()引起的。但是,创建的数据行从未添加到表行集合中,表行计数也从未超过零 我的问题是,为什么每次调用NewRow时都会占用更多内存,即使新创建的DataRow从未添加到Rows集合,并且从NewRow返回的DataRow总是分配给同一个局部变量(因此显然会丢弃最后一个新行) 请忽略代码为什么创建未添加到表中的数据行的问题 我认为你的两个问题是相关的 Table.NewRow创建与初始表具有相同列格式的新数据行 需要使用table.Ro

在调查内存泄漏时,我发现它是由多次对循环中的表调用NewRow()引起的。但是,创建的数据行从未添加到表行集合中,表行计数也从未超过零

我的问题是,为什么每次调用NewRow时都会占用更多内存,即使新创建的DataRow从未添加到Rows集合,并且从NewRow返回的DataRow总是分配给同一个局部变量(因此显然会丢弃最后一个新行)


请忽略代码为什么创建未添加到表中的数据行的问题

我认为你的两个问题是相关的

Table.NewRow创建与初始表具有相同列格式的新数据行

需要使用table.Rows.Add(newRow)将新行添加到表中。循环将创建从未使用过的对象,因此将消耗内存。 有关更多信息,请参阅本文

DataRow从DataTable继承架构,因此存在从DataRow到生成该行的表架构的引用。新行在表中处于分离状态。
这就是GC将新未使用的行单独保留的原因

DataTable.NewRow()将创建的行添加到DataTable的RecordManager中。我不完全确定为什么会发生这种情况,但这就是为什么GC不能释放它

似乎只有两种方法可以摆脱DataRow:

  • 将其添加到表中,然后删除
  • 调用DataTable.Clear()

  • 如果您创建newRow=table.newRow(),然后在下面的代码中决定比这个新行更不需要。 1) 在表中添加if行。 2) 卸下,它将防止内存泄漏

        var table = new DataTable();
        while (true)
        {
            var newRow = table.NewRow();
            table.Rows.Add(newRow);   //Without this 2 rows you will have memory leak.
            table.Rows.Remove(newRow);//
        }
    

    嗨,Stephen,我明白了,我只是不知道为什么它在从未使用过行的情况下使用内存。我想我是在寻找一些关于数据表中幕后发生的更深入的信息。这个答案并没有真正解决OP的实际问题。