ACE_Message_Block引起内存泄露问题
ACE_Message_Block *mb = new ACE_Message_Block (30);ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");
ACE_OS::printf("%s\n",mb->rd_ptr ());
mb->release();
运行后输出窗口显示
Object dump complete.
Detected memory leaks!
Dumping objects ->
{576} normal block at 0x01A5C828, 8 bytes long.
Data: < > E0 C7 A5 01 CD CD CD CD
{575} normal block at 0x01A5C7E0, 8 bytes long.
Data: <( Z> 28 C8 A5 01 20 E7 D3 5A
....................
这是为什么? 本帖最后由 freeeyes 于 2012-4-4 15:12 编辑
明显是你的指针没有释放,你应该:
ACE_Message_Block *mb = new ACE_Message_Block (30);
ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");
ACE_OS::printf("%s\n",mb->rd_ptr ());
mb->release();
delete mb;
或者
Message_Block mb(30);
ACE_OS::sprintf(mb.wr_ptr(),"%s","hello");
ACE_OS::printf("%s\n",mb.rd_ptr ());
mb.release();
前面的大侠,加上 delete mb ,会引起
Unhandled exception at 0x00c715de in testace.exe: 0xC0000005: Access violation reading location 0xfeeefeee.
就是访问了无效的指针啊,很明显 调用release后,mb已经被释放了
参考ACE文档,说release 就可以正确释放的 Message_Block mb(30);
mb.release();
好像貌似会发生死锁 源代码没问题,不会泄漏。
这个代码无效的,release只对heap,reference。counted
Message_Block mb(30);
mb.release();
1-5楼的同学好像昏头吧。
char* tmpcstr ="hello";
ACE_Message_Block *mb = 0;
ACE_NEW_RETURN(mb,ACE_Message_Block(stlen(tmpcstr)+1),-1);
if(mb)
{
mb->copy(tmpcstr);
ACE_OS::printf("%s\n",mb->rd_ptr ());
mb->release();
} 关于楼主的代码本身并没有什么错误,也不是ACE的问题..
解决的办法是这样的:
楼主在编译的时候采用了Use Unicode Character Set方式就会出现这种内存泄露的问题,所以在进行ACE的使用的时候尽量的采用Use Multi-Byte Character Set进行工程的编译,这样内存泄露的问题就会解决...
希望对楼主有所帮助:):) 关于楼主的代码本身并没有什么错误,也不是ACE的问题..
解决的办法是这样的:
楼主在编译的时候采用了Use Unicode Character Set方式就会出现这种内存泄露的问题,所以在进行ACE的使用的时候尽量的采用Use Multi-Byte Character Set进行工程的编译,这样内存泄露的问题就会解决...
希望对楼主有所帮助 freeeyes 发表于 2012-4-4 15:11 static/image/common/back.gif
明显是你的指针没有释放,你应该:
版主这里再次进行了delete应该存在问题吧..:lol
页:
[1]