2008-10-28 3 views
5

메모리 누수를 조사하는 동안 루프 내에서 테이블에 NewRow()를 여러 번 호출하여 발생했음을 발견했습니다. 그러나 생성 된 DataRow는 테이블 행 모음에 추가되지 않으며 테이블 행 수가 0을 초과하지 않습니다.테이블 NewRow() 메모리 누수가 발생합니다.

내 질문은 새로 만든 DataRow가 Rows 컬렉션에 추가되지 않고 NewRow에서 반환 된 DataRow가 항상 동일한 로컬 변수에 할당 되어도 (따라서 분명히 버려진 경우에도 NewRow가 호출 될 때마다 더 많은 메모리를 사용합니다) 마지막 새로운 행).

코드가 테이블에 추가되지 않는 DataRow를 만드는 이유에 대한 문제를 무시하십시오!

답변

5

의 DataRow는 DataTable의에서 스키마를 상속은이 문서를 참조하십시오, 그렇게 행을 생성 된 테이블 스키마의 DataRow에서 참조가 있습니다. 새 행은 테이블의 분리 상태에 있습니다.
이것이 GC가 사용하지 않는 새로운 행을 남긴 이유입니다.

1

두 가지 문제가 관련이 있다고 생각합니다.

Table.NewRow는 초기 테이블과 동일한 열 형식을 갖는 새 데이터 행을 만듭니다.

이 새 행을 table.Rows.Add (newRow)를 사용하여 테이블에 추가해야합니다. 루프는 사용되지 않는 객체를 생성하므로 메모리를 소모합니다. 자세한 내용 http://msdn.microsoft.com/en-us/library/system.data.datatable.newrow.aspx

+0

안녕하세요. 스티븐, 저는 그 행이 사용되지 않을 때 왜 메모리를 사용하는지 잘 모르겠습니다. 나는 DataTable의 배경에 어떤 일이 벌어지고 있는지에 대한 좀 더 깊은 정보를 얻었습니다. –

4

DataTable.NewRow()는 만든 행을 DataTable의 RecordManager에 추가합니다. 왜 이런 일이 발생하는지 완전히 확신 할 수는 없지만 이것이 GC에 의해 해제되지 않은 이유입니다.

  1. 후 삭제, 테이블에 추가

    DataRow를 제거하는 두 가지 방법이 있다는 것을 나타납니다.

  2. DataTable.Clear()를 호출하십시오.
관련 문제