Skip to Content

How to properly dispose reports and viewers in managed C++?

Problem is that CR leaks memory, especially when using the viewer. I found this posting which describes the proper way to dispose of that memory:

http://stackoverflow.com/questions/29643043/crystalreports-reportdocument-memory-leak-with-database-connections.

In my code I am using the method described here:

http://www.codeproject.com/Articles/12308/Using-WinForms-controls-in-an-MFC-dialog<br>

Problem is that in C++, I cannot call ->Dispose(). It tells med to call the destructor ~ReportViewer instead.

Can someone provide an example how to properly end a report on screen so that all memory is released? This is what I have now and it has improved the leaks that used to be 13Mb so that it is now under 1Mb:

void CFloaterDlg::OnClose()
{
	CrystalDecisions::CrystalReports::Engine::ReportDocument ^Report;
	Report = (CrystalDecisions::CrystalReports::Engine::ReportDocument ^)m_Viewer->ReportSource;
	Report->Close();
	//
	m_Viewer->ReportSource = nullptr;
	m_Viewer->~CrystalReportViewer();
	//delete m_Viewer;
	//
	GC::Collect();
	GC::WaitForPendingFinalizers();
	GC::Collect();
	//
	//
	CDialog::OnClose();
	//
	m_Viewer.DestroyWindow();
	DestroyWindow();
}

Question is how and when to destroy the underlying ReportDocument. Does the viewer hold a copy of the data? Ie can the ReportDocument be destroyed before the viewer is?
Add comment
10|10000 characters needed characters exceeded

  • Get RSS Feed

2 Answers

  • Best Answer
    Jun 08 at 04:53 PM
    Add comment
    10|10000 characters needed characters exceeded

  • Apr 18, 2017 at 07:47 AM

    Still confused. When I see this in the crystal log file, I would assume that there is no resources in use anymore and that garbage collect would free memory??

    Also. I am sort of wondering about the relationship between the ReportDocument and the Viewer as indicated in my original question.

    .\..\src\crpe\crpe.cpp:826,Closing engine,After close engine use count,"0"
    
    Add comment
    10|10000 characters needed characters exceeded