2014-05-22 43 views
0

我是MFC新手。MFC中的资源泄漏SendMessage()

如何发布以(WPARAM)SendMessage()中传递的资源。

这里我使用“新”为它创建。以下是相同的快照。

void Build::BuildCube() 
{ 

    SCtPt *data = new SCtPt; 
    data->vm = true; 
    int dir = 100; 
    MFrame()->SendMessage(WM_MAP_NEW, (WPARAM)data, (LPARAM) dir); 
} 

我想确保此功能的“数据”资源获得释放。

谢谢...

+0

什么是MFrame,它是如何处理该消息的?它是否在某处保留对该指针的引用?假设不是,在完成处理该消息后,您可以安全地删除它,这将在SendMessage返回后进行。 –

+0

此外,如果不是,则可能更容易创建自动变量或使用shared_ptr。 –

回答

3

作为SendMessage() API是同步的API,它返回之前将消息发送到其它窗口过程。当调用SendMessage()回报,那么数据可以释放/发布:

void Build::BuildCube() 
{ 
    SCtPt *data = new SCtPt; 
    data->vm = true; 
    int dir = 100; 
    MFrame()->SendMessage(WM_MAP_NEW, (WPARAM)data, (LPARAM)dir); 
    delete data; 
} 

或者,更好的,你可以完全避免的堆上分配数据。只需将它分配在栈上,让RAII处理其余部分:

void Build::BuildCube() 
{ 
    SCtPt data;  // don't use "new", so you won't get a pointer 
    data.vm = true; 
    int dir = 100; 
    MFrame()->SendMessage(WM_MAP_NEW, (WPARAM)data, (LPARAM)dir); 
    // no delete necessary! 
} 
+7

请注意,这意味着它不需要在堆上分配。把它变成一个堆栈变量。 –

+0

是否可以,如果我删除它处理此消息的函数或如果它是同步API,那么我想在这里删除它是安全的。 – user1833852

+1

在处理消息的函数中删除是可以的,但是你需要记住不要在BuildCube()中再次删除,更好的解决办法是在SendMessage返回后删除,所以分配和释放是在集中控制下。 –

5

你考虑写这样的代码:

void Build::BuildCube() 
{ 
    SCtPt data; 
    data.vm = true; 
    int dir = 100; 
    MFrame()->SendMessage(WM_MAP_NEW, (WPARAM)&data, (LPARAM)dir); 
} 

这种方式发送,WPARAM的数据仍然是指向你的对象,但是当应用程序退出此方法的作用域时,它将调用析构函数并为您执行清理。

+1

这究竟是为什么被投票呢?鉴于最初的问题,这是要走的路。除非您打算将指针存储在某处供以后使用,否则无需分配SendMessage。 – imbtfab

+0

这也是我的建议。除了data-> vm s/b data.vm之外,由于它不是指针。 –

0

我们通常这样做:

在数据分配点,注释状态明确在那里将被释放。

void Build::BuildCube() 
{ 

    SCtPt *data = new SCtPt; // Will be deallocated in handler of message WM_MAP_NEW 
    data->vm = true; 
    int dir = 100; 
    MFrame()->SendMessage(WM_MAP_NEW, (WPARAM)data, (LPARAM) dir); 
} 

LRESULT CMainFrame::OnMapNew(WPARAM wParam, LPARAM) 
{ 
    SCtPt *data = (SCtPt*) wParam; 
    // do something with data; 

    delete data; 
} 
+0

评论非常好,但对于阻止资源泄漏没有多大帮助。它依赖程序员不犯错误,我们都知道这不太可能。 :-)如果你确实需要一个,最好在接收窗口过程中复制数据。让调用者和被调用者保持独立的内存管理。代码审查更容易以这种方式捕获错误。 –

+0

同意!这并不完美。 – Max