[C++-sig] Howto delete python object from C++ code.

Siarhei Rachytski siarhei.rachytski at gmail.com
Tue Jan 9 13:24:14 CET 2007


I've just realized what the problem is... The
boost::python::object(pWindow) creates a new python object, say py1,
and associates the pWindow with it. But somewhere in the interpreter
internals live the object py2, which has the same pWindow associated
with it. When I delete py1, I also delete pWindow and get a dangling
reference held by py2, am I right? If yes, how could I get
boost::python::object which represents py2?

On 1/9/07, Grayyoga <grayyoga at gmail.com> wrote:
> On 1/9/07, Stefan Seefeld <seefeld at sympatico.ca> wrote:
> > Siarhei Rachytski wrote:
> > > Hi
> > >
> > > I have a python wrapper for a class which implements a Win32 window in
> > > a separate thread. When it's created the message loop is initiated
> > > from a separate thread, and when loop exits(this means the user
> > > pressed the close button and the window should be destroyed), I want
> > > to delete a C++ object and its python counterpart. I delete C++ object
> > > using boost::python::decref, however the python variable this object
> > > has been assigned to still exists, the "print" function shows me smth
> > > like this (cgepython.Window object at 0xADDRHERE). But I want it to be
> > > deleted too. How could I implement this behaviour?
> >
> > Python uses garbage collection to reclaim unreferenced objects (for most
> > objects that simply means reference counting). Thus, there is no guarantee
> > that the object will be deleted at a particular point in time.
> > Some other part of the program may still refer to it, and even if not,
> > the cleanup may be implemented differently.
> >
> > Regards,
> >                 Stefan
> >
>
> Referenceing to the deleted object is an error isn't it? I've checked
> it carefully - in the part of the program(at the end of the thread
> function) the object is deleted, the destructor is called, resources
> are freed, window destroyed, and so forth, so next time somebody will
> try to access this object it will probably result in a crash.
>
> Maybe some code will clarify the problem, cause my English isn't very good :)
>
> In python
>
> d = loadDisplayDriver()
> w = d.createWindowContext(500, 200, u'test window')
> //here the window appears in the separate thread(see thread function
> code below),
> //we work with it for some time and then close it, the C++ code
> deletes object, but...
> print w
> /// shows something like this
> (cgepython.Window object at 0xADDRHERE)
> /// but after explicit deletion of the object...
> del w
> /// ... everything is ok, print w spits with error
>
>
> C++ code
>
>                 DWORD WINAPI ListenWindow(LPVOID Param)
>                 {
>                         SWindowInitParam * pParam = (SWindowInitParam*)Param;
>
>                         WNDCLASSEX wc;
>
>                         if (!GetClassInfoEx(GetModuleHandle(0), L"cge_python_window", &wc))
>                         {
>                                 wc.cbClsExtra    = 0;
>                                 wc.cbSize                = sizeof(WNDCLASSEX);
>                                 wc.cbWndExtra    = 0;
>                                 wc.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
>                                 wc.hIconSm       = LoadIcon(GetModuleHandle(0), IDI_APPLICATION);
>                                 wc.hCursor       = LoadCursor(GetModuleHandle(0), IDC_ARROW);
>                                 wc.hIcon         = LoadIcon(GetModuleHandle(0), IDI_APPLICATION);
>                                 wc.hInstance     = GetModuleHandle(0);
>                                 wc.lpfnWndProc   = WindowProc;
>                                 wc.lpszClassName = L"cge_python_window";
>                                 wc.lpszMenuName  = NULL;
>                                 wc.style                 = 0;
>
>                                 if (!RegisterClassEx(&wc)) return 0;
>                         }
>
>
>                         HWND Window = CreateWindow(
>                                 L"cge_python_window",
>                                 pParam->m_WindowName.c_str(),
>                                 WS_OVERLAPPEDWINDOW,
>                                 0,
>                                 0,
>                                 pParam->m_Width,
>                                 pParam->m_Height,
>                                 (HWND)0,
>                                 (HMENU)0,
>                                 GetModuleHandle(0),
>                                 (LPVOID)0);
>
>                         pParam->m_Window = Window;
>                         SetEvent(pParam->m_WindowCreated);
>
>                         HANDLE WindowContextInitialized = pParam->m_WindowContextInitialized;
>                         WaitForSingleObject(WindowContextInitialized, INFINITE);
>                         CloseHandle(WindowContextInitialized);
>
>                         CWindow * pWindow =
> reinterpret_cast<CWindow*>(GetWindowLong(Window, GWL_USERDATA));
>
>                         ShowWindow(Window, SW_SHOW);
>
>                         MSG msg;
>
>                         while (true)
>                         {
>                                 int res = GetMessage(&msg, Window, 0, 0);
>
>                                 if ( (res == 0) || (res== -1) ) break;
>
>                                 TranslateMessage(&msg);
>                                 DispatchMessage(&msg);
>                         }
>
>                         boost::python::object obj(pWindow);
>
>                         /// when obj goes out of scope the destructor
> on CWindow object is called
>
>                         return 0;
>                 }
>
>
>
> > --
> >
> >       ...ich hab' noch einen Koffer in Berlin...
> > _______________________________________________
> > C++-sig mailing list
> > C++-sig at python.org
> > http://mail.python.org/mailman/listinfo/c++-sig
> >
>



More information about the Cplusplus-sig mailing list