Archived

This forum has been archived. Please start a new discussion on GitHub.

memory leak with Ice::IllegalIndirectionException

I have a simple program,which try to capture the images from camera,and send them with Ice.
I use VLD to detect the memory leak,it gives me these information:
Block 1001 at 0x003E37B0: 24 bytes
Call Stack:
0x0044100A (File and line number not available): (Function name unavailable)
0x005CFC73 (File and line number not available): malloc_dbg
0x005CFB2F (File and line number not available): malloc_dbg
0x005CFADC (File and line number not available): malloc_dbg
0x005DB25B (File and line number not available): malloc
0x005BD691 (File and line number not available): operator new
0x004AC8AE (File and line number not available): IceUtil::Time::microSeconds
0x10046729 (File and line number not available): Ice::IllegalIndirectionException::IllegalIndirectionException
0x100466D0 (File and line number not available): Ice::IllegalIndirectionException::IllegalIndirectionException
0x1013973A (File and line number not available): Ice::IllegalIndirectionException::IllegalIndirectionException
0x101DD4BB (File and line number not available): Ice::IllegalIndirectionException::IllegalIndirectionException
0x101DFDE5 (File and line number not available): Ice::IllegalIndirectionException::IllegalIndirectionException
0x101DE46A (File and line number not available): Ice::IllegalIndirectionException::IllegalIndirectionException
0x00433AC9 (File and line number not available): (Function name unavailable)
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp (37): AfxWinMain
0x004458FA (File and line number not available): (Function name unavailable)
0x0043ED88 (File and line number not available): (Function name unavailable)
0x0043EAEF (File and line number not available): (Function name unavailable)
0x7C817067 (File and line number not available): RegisterWaitForInputIdle
Data:
C0 7C 15 00 FF FF FF FF 00 00 00 00 00 00 00 00 .|...... ........
00 00 00 00 00 00 00 00 ........ ........

Visual Leak Detector detected 11 memory leaks.

my slice file is :
module transfer {

	class Target {
		int id;
		string ip;
	};
	
	sequence<Target> Des;
	
	sequence<byte> Frame;
	
	
	
	interface Service {
		void transfer(Des targets,int len,Frame f);
	};
};

The code where I send the frame is:
void CCapSvrDlg::CamFrameData(double dblSampleTime, BYTE * pBuffer, long lBufferSize)
{
	try {
		//located
		Target* tt=new Target;
		tt->id=1;
		tt->ip="127.0.0.1";
		TargetPtr t(tt);
		vector<TargetPtr> d;
		d.push_back(t);
		//prepare net buffer
		BufferForNet b;
		b.index=index;
		b.length=lBufferSize;
		//increase frame index
		index++;
		//copy xvid frame
		vector<byte> vb(sizeof(b)+lBufferSize);
		memcpy(&vb[0],&b,sizeof(b));
		memcpy(&vb[0]+sizeof(b),pBuffer,lBufferSize);
		//transfer
		adaptor->transfer(d,sizeof(b)+lBufferSize,vb);
		Sleep(10);
	}catch (const Ice::Exception& ex) { 
		ostringstream ostr;
		ostr << ex;
		string s = ostr.str();
		AfxMessageBox(CString(s.c_str()), MB_OK|MB_ICONEXCLAMATION);
	}catch (const char* msg) { 
		AfxMessageBox(CString(msg), MB_OK|MB_ICONEXCLAMATION);
	}
}
How are these problems going?

Comments

  • matthew
    matthew NL, Canada
    I don't see a problem in the code that would cause the leaks. However, I would recommend some changes:

    Change:
    Target* tt=new Target;
    tt->id=1;
    tt->ip="127.0.0.1";
    TargetPtr t(tt);
    

    to:
    TargetPtr t=new Target;
    t->id=1;
    t->ip="127.0.0.1";
    

    Later you do:
    BufferForNet b;
    b.index=index;
    b.length=lBufferSize;
    // ...
    vector<byte> vb(sizeof(b)+lBufferSize);
    memcpy(&vb[0],&b,sizeof(b));
    

    Copying a raw struct is not a good idea. You are completely dependent upon the compiler struct layout, and the endianess of the host system. It would be far better to make BufferForNet use a slice struct instead, and change transfer to:
    void transfer(Des targets, BufferForNet bfn, Frame f);
    

    Also note that the len is not necessary since sequences contain their length.

    I highly doubt that these leaks are real. For example, Time::microSeconds and IllegalIndirectionException do not leak memory (in fact, IllegalIndirectionException does not appear to be used at all anymore).
  • Thanks, I have tried the mfc sample in Ice distribution, VLD aslo reports some memory leaks, may be it's wrong.