<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.6000.17023" name=GENERATOR></HEAD>
<BODY>
<DIV dir=ltr align=left><FONT face=Arial color=#0000ff 
size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=994241706-20042010><FONT face=Arial 
color=#0000ff size=2>The call to _this() implicitly activates the object and 
increments the reference count. As I already posted, you have to deactivate the 
object in order to get it destructed properly.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=994241706-20042010><FONT face=Arial 
color=#0000ff size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=994241706-20042010><FONT face=Arial 
color=#0000ff size=2>Wernke</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=994241706-20042010><FONT face=Arial 
color=#0000ff size=2></FONT></SPAN>&nbsp;</DIV><BR>
<BLOCKQUOTE 
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid; MARGIN-RIGHT: 0px">
  <DIV class=OutlookMessageHeader lang=en-us dir=ltr align=left>
  <HR tabIndex=-1>
  <FONT face=Tahoma size=2><B>From:</B> omniorb-list-bounces@omniorb-support.com 
  [mailto:omniorb-list-bounces@omniorb-support.com] <B>On Behalf Of </B>risc 
  risc<BR><B>Sent:</B> 18 April 2010 11:47<BR><B>To:</B> 
  omniorb-list@omniorb-support.com<BR><B>Subject:</B> Re: [omniORB] problem with 
  server memory deallocation<BR></FONT><BR></DIV>
  <DIV></DIV>Hi Duncan,<BR><BR>thanks for your reply. I see the leak because i 
  don't see the print of object destructor when the object is cancelled. I try 
  to post a minimal example<BR><BR>IDL FILE:
  <DIV><BR><BR>module test<BR>{<BR>&nbsp; interface p1<BR>&nbsp;&nbsp; { 
  <BR>&nbsp;&nbsp;&nbsp; attribute&nbsp; string name;<BR>&nbsp;&nbsp; 
  };<BR>&nbsp; interface p2<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; p1 
  function();<BR>&nbsp; };<BR><BR>};<BR><BR><BR></DIV>CLIENT:
  <DIV><BR><BR><BR>&nbsp;&nbsp;&nbsp; CORBA::ORB_var orb = CORBA::ORB_init(argc, 
  argv);<BR><BR><BR>&nbsp;&nbsp;&nbsp; if( argc != 2 ) 
  {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "usage:&nbsp; eg2_clt 
  &lt;object reference&gt;" &lt;&lt; endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  return 1;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; CORBA::Object_var 
  obj = 
  orb-&gt;string_to_object(argv[1]);<BR><BR><BR><BR></DIV>&nbsp;&nbsp;&nbsp;&nbsp; 
  test::p2_var pd=test::p2::_narrow(obj);<BR><BR>&nbsp;&nbsp; if( 
  CORBA::is_nil(pd) ) {
  <DIV><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "Can't narrow 
  reference to type Echo (or it was nil)." &lt;&lt; 
  endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<BR>&nbsp;&nbsp;&nbsp; 
  }<BR><BR><BR></DIV>&nbsp;test::p1_var l=pd-&gt;function();<BR>&nbsp; 
  <BR>&nbsp;l-&gt;name();<BR><BR>&nbsp;orb-&gt;destroy();<BR>&nbsp;<BR>&nbsp;}<BR><BR><BR><BR><BR><BR>SERVER:<BR><BR><BR>class 
  test_p1_i: public POA_test::p1 {<BR>private:<BR>&nbsp;<BR>public:<BR>&nbsp; // 
  standard constructor<BR>&nbsp; test_p1_i();<BR>&nbsp; virtual 
  ~test_p1_i();<BR><BR>&nbsp; // methods corresponding to defined IDL attributes 
  and operations<BR>&nbsp; void name(const char*);<BR>&nbsp; char* 
  name();<BR><BR>};<BR><BR>//<BR>// Example implementational code for IDL 
  interface test::p1<BR>//
  <DIV><BR>test_p1_i::test_p1_i(){<BR>&nbsp; // add extra constructor code 
  here<BR>&nbsp; cout&lt;&lt;"constructor 
  Call"&lt;&lt;endl;<BR>}<BR>test_p1_i::~test_p1_i(){<BR>&nbsp; // add extra 
  destructor code here<BR>&nbsp;cout&lt;&lt;"Destructor 
  Call"&lt;&lt;endl;<BR>}<BR>//&nbsp;&nbsp; Methods corresponding to IDL 
  attributes and operations<BR>void test_p1_i::nome(const char*){<BR>&nbsp; // 
  insert code here and remove the warning<BR>&nbsp;<BR>}<BR><BR></DIV>char* 
  test_p1_i::name(){
  <DIV><BR>&nbsp; // insert code here and remove the 
  warning<BR><BR>}<BR><BR><BR><BR></DIV>class test_p2_i: public POA_test::p2 
  {<BR>private:<BR>&nbsp; <BR>public:<BR>&nbsp; // standard 
  constructor<BR>&nbsp; test_p2_i();<BR>&nbsp; virtual 
  ~test_p2_i();<BR><BR>&nbsp; // methods corresponding to defined IDL attributes 
  and operations<BR>&nbsp; test::p1_ptr function();<BR><BR>};<BR><BR>//<BR>// 
  Example implementational code for IDL interface test::p2<BR>//
  <DIV><BR>test_p2_i::test_p2_i(){<BR>&nbsp;<BR></DIV>
  <DIV>cout&lt;&lt;"Constructor 
  p2"&lt;&lt;endl;<BR>}<BR>test_p2_i::~test_p2_i(){<BR>&nbsp;<BR></DIV>
  <DIV>&nbsp;cout&lt;&lt;"destructor p2"&lt;&lt;endl;<BR>}<BR>//&nbsp;&nbsp; 
  Methods corresponding to IDL attributes and operations<BR><BR>test::p1_ptr 
  test_p2_i::function(){<BR>&nbsp; // insert code here and remove the 
  warning<BR></DIV>
  <DIV>&nbsp; test_p1_i * n=new test_p1_i;<BR><BR></DIV>&nbsp; 
  n-&gt;name("Alfred");
  <DIV><BR>&nbsp; <BR>&nbsp; test::p1_var ret=n-&gt;_this();<BR><BR></DIV>
  <DIV>&nbsp; n-&gt;_remove_ref();<BR><BR>&nbsp;return&nbsp; 
  ret._retn();<BR>}<BR><BR><BR><BR></DIV>// End of example implementational 
  code<BR><BR><BR><BR>int main(int argc, char** argv)<BR>{<BR>&nbsp; try 
  {<BR>&nbsp;&nbsp;&nbsp; // Initialise the ORB.
  <DIV><BR>&nbsp;&nbsp;&nbsp; CORBA::ORB_var orb = CORBA::ORB_init(argc, 
  argv);<BR><BR></DIV>&nbsp;&nbsp;&nbsp; // Obtain a reference to the root 
  POA.<BR>&nbsp;&nbsp;&nbsp; CORBA::Object_var obj = orb-&gt;resolve_initial_
  <DIV class=gmail_quote>references("RootPOA");<BR>&nbsp;poa = 
  PortableServer::POA::_narrow(obj);<BR><BR>&nbsp;&nbsp;&nbsp; // We allocate 
  the objects on the heap.&nbsp; Since these are reference<BR>&nbsp;&nbsp;&nbsp; 
  // counted objects, they will be deleted by the POA when they are 
  no<BR>&nbsp;&nbsp;&nbsp; // longer needed.<BR>&nbsp; &nbsp;&nbsp;&nbsp; 
  test_p2_i* mytest_p2_i = new test_p2_i();<BR><BR><BR>&nbsp;&nbsp;&nbsp; // 
  Activate the objects.&nbsp; This tells the POA that the objects 
  are<BR>&nbsp;&nbsp;&nbsp; // ready to accept 
  requests.<BR>&nbsp;&nbsp;&nbsp;&nbsp; PortableServer::ObjectId_var 
  mytest_p2_iid = 
  poa-&gt;activate_object(mytest_p2_i);<BR><BR><BR>&nbsp;&nbsp;&nbsp; // Obtain 
  a reference to each object and output the stringified<BR>&nbsp;&nbsp;&nbsp; // 
  IOR to stdout<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  // IDL interface: test::p2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CORBA::Object_var 
  ref = mytest_p2_i-&gt;_this();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  CORBA::String_var 
  sior(orb-&gt;object_to_string(ref));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  std::cout &lt;&lt; "IDL object test::p2 IOR = '" &lt;&lt; (char*)sior &lt;&lt; 
  "'" &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; 
  }<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp; // Obtain a POAManager, and tell the POA 
  to start accepting<BR>&nbsp;&nbsp;&nbsp; // requests on its 
  objects.<BR>&nbsp;&nbsp;&nbsp; PortableServer::POAManager_var pman = 
  poa-&gt;the_POAManager();<BR>&nbsp;&nbsp;&nbsp; 
  pman-&gt;activate();<BR><BR>&nbsp;&nbsp;&nbsp; 
  orb-&gt;run();<BR>&nbsp;&nbsp;&nbsp; orb-&gt;destroy();<BR>&nbsp; 
  }<BR>....<BR><BR><BR>I See after the client make orb-&gt;destroy() the cout in 
  the P1 destroctor is not be called.<BR><BR>Thanks <BR>Best 
  Regards<BR></DIV><BR></BLOCKQUOTE></BODY></HTML>