1. MFC程序,链接ace.lib (不是acemfc.lib),仅调用初始化 ACE::init()和结束ACE::fini(),编译器如下提示
{167} normal block at 0x0181B9C0, 6 bytes long.
Data: < > 00 00 00 00 00 00
{166} normal block at 0x0181B968, 28 bytes long.
Data:
68 B9 81 01 1C A9 23 10 00 00 00 00 00 00 00 00
Object dump complete.
2. MFC程序,链接TAO,OpenDDS,同样只作初始化和结束操作,编译器显示如下提示
Data:
49 6D 52 5F 43 6C 69 65 6E 74 5F 41 64 61 70 74
{451} normal block at 0x0181C790, 20 bytes
long.
Data:
4F 52 54 5F 41 64 61 70 74 65 72 5F 46 61 63 74
{450} normal block at 0x01821FA0, 40 bytes
long.
Data: < # > 1C A9 23 10 13 00 00 00 14 00 00 00 90 C7 81 01
{180} normal block at 0x0181BE38, 8 bytes
long.
Data:
55 4E 4B 4E 4F 57 4E 00
{179} normal block at 0x0181BDD8, 30 bytes
long.
Data:
49 44 4C 3A 6F 6D 67 2E 6F 72 67 2F 43 4F 52 42
{167} normal block at 0x0181B9C0, 6 bytes
long.
Data: < > 00 00 00 00 00 00
{166} normal block at 0x0181B968, 28 bytes
long.
Data:
68 B9 81 01 1C A9 23 10 00 00 00 00 00 00 00 00
Object dump complete.
3. MFC程序,初始化DDS参与考工厂,结束时正常回收,代码如下
int MyPublsher::init(int& argc, char *argv[]) { dpf_ = TheParticipantFactoryWithArgs (argc, argv); if (CORBA::is_nil (dpf_.in ()) ) { ACE_ERROR((LM_ERROR, ACE_TEXT("ERROR - Create participant factory failed./n") )); return -1; } // Create participant dp_ = dpf_->create_participant (411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil ()); if (CORBA::is_nil (dp_.in ()) ) { ACE_ERROR((LM_ERROR, ACE_TEXT("ERROR - Create participant failed./n") )); return -1; } return 0; }
int MyPublisher::fini() { // Clean up the transport // Clean up all the entities in the participant dp_->delete_contained_entities (); // Clean up the participant dpf_->delete_participant (dp_.in ()); TheTransportFactory->release (); // Clean up DDS TheServiceParticipant->shutdown (); return 0; }
内存dump信息如下:
{2253} normal block at 0x0182DBB0, 44 bytes long.
Data: < @ > 00 00 00 00 40 09 1C 00 FF FF FF FF 00 00 00 00
{2252} normal block at 0x01867F78, 28 bytes long.
Data: 50 9C 15 00 FF FF FF FF 00 00 00 00 00 00 00 00
{2190} normal block at 0x01874798, 60 bytes long.
Data: < > 00 00 00 00 00 00 00 00 A0 E8 83 01 00 00 00 00
{2164} normal block at 0x01873010, 15 bytes long.
Data: < RST ;EI > 14 01 0F 00 52 53 54 02 3B 45 49 AB 87 04 00
{2163} normal block at 0x01872FC8, 8 bytes long.
Data: < > 00 00 00 00 01 00 00 00
{2162} normal block at 0x01872F70, 24 bytes long.
Data: < - / > 90 2D 81 00 08 00 00 00 08 00 00 00 C8 2F 87 01
{2160} normal block at 0x01872EE0, 8 bytes long.
Data: < > 00 00 00 00 01 00 00 00
{2159} normal block at 0x01872E98, 8 bytes long.
Data: < . > 98 2E 87 01 20 8A 86 01
{2158} normal block at 0x01872E50, 8 bytes long.
Data:
52 6F 6F 74 50 4F 41 00
{2143} normal block at 0x01869160, 32768 bytes
long.
Data: < # # > 1C A9 23 10 00 00 00 00 00 00 00 00 16 A3 23 10
{2142} normal block at 0x018690C8, 88 bytes
long.
Data: < > B4 BF 81 00 00 00 00 00 00 00 00 00 0C BF 81 00
{2141} normal block at 0x01869030, 88 bytes
long.
Data: < > A4 E5 81 00 00 00 00 00 00 00 00 00 FC E4 81 00
{2140} normal block at 0x01868F98, 88 bytes
long.
Data: < c b > 84 63 81 00 00 00 00 00 00 00 00 00 DC 62 81 00
{2139} normal block at 0x01868F00, 88 bytes
long.
Data:
4C 4F 81 00 01 00 00 00 00 00 00 00 A4 4E 81 00
{2138} normal block at 0x01868E68, 88 bytes
long.
Data: < X /W > 04 58 81 00 00 00 00 00 00 00 00 00 5C 57 81 00
{2137} normal block at 0x01868DD0, 88 bytes
long.
Data: < m l > 8C 6D 81 00 00 00 00 00 00 00 00 00 E4 6C 81 00
{2136} normal block at 0x01868D38, 88 bytes
long.
Data: < > 9C F4 81 00 00 00 00 00 00 00 00 00 F4 F3 81 00
{2135} normal block at 0x01868CD8, 32 bytes
long.
Data: < t > F8 8C 86 01 74 8D 86 01 0C 8E 86 01 A4 8E 86 01
{2134} normal block at 0x018687C0, 8 bytes
long.
Data:
52 6F 6F 74 50 4F 41 00
{2133} normal block at 0x01868A20, 632 bytes
long.
Data: < # > 98 DB 81 00 EC DB 81 00 1C A9 23 10 07 00 00 00
{2122} normal block at 0x018684B0, 16 bytes
long.
Data: < "
> F4 22 00 00 AC 80 86 01 A0 DC 84 01 A0 DC 84 01
{2121} normal block at 0x018683A0, 4 bytes
long.
Data: < j > A4 B9 6A 00
{2120} normal block at 0x01868330, 48 bytes
long.
Data:
> 70 B8 6A 00 F4 22 00 00 A8 81 85 01 01 CD CD CD
{2119} normal block at 0x018682E8, 12 bytes long.
Data: <` j > 60 B8 6A 00 00 00 00 00 D8 99 83 01
{2118} normal block at 0x01868188, 16 bytes long.
Data:
50 B8 6A 00 00 00 00 00 A8 EB 83 01 D8 99 83 01
{2117} normal block at 0x018682A0, 9 bytes long.
Data: <10.0.0.8 > 31 30 2E 30 2E 30 2E 38 00
{2116} normal block at 0x01868260, 4 bytes long.
Data: < > A0 82 86 01
{2115} normal block at 0x01868200, 32 bytes long.
Data: < ( j > 01 00 00 00 28 B8 6A 00 02 00 00 00 10 00 00 00
{2113} normal block at 0x01868058, 240 bytes long.
Data: < j > D8 B4 6A 00 CD CD CD CD 00 00 00 00 CD CD CD CD
{2112} normal block at 0x01868018, 4 bytes long.
Data:
58 80 86 01
{2111} normal block at 0x01867FD0, 8 bytes
long.
Data: < > 18 80 86 01 01 00 00 00
{2108} normal block at 0x01867D98, 8 bytes
long.
Data: < } > 98 7D 86 01 00 84 86

本文探讨了在MFC应用程序中使用ACE库时遇到的内存泄漏问题。在仅调用ACE的初始化和结束函数,以及在结合使用TAO和OpenDDS时,编译器都给出了内存泄漏的提示。尽管在结束DDS参与者工厂时进行了正常回收,但内存dump信息仍然显示出内存泄漏的存在。文章深入分析了可能的原因并提出了相应的解决策略。
最低0.47元/天 解锁文章
2675





