C++ 是否需要删除此对象?
在使用Direct2D的MFC应用程序中,我有非常简单的代码:C++ 是否需要删除此对象?,c++,mfc,C++,Mfc,在使用Direct2D的MFC应用程序中,我有非常简单的代码: //在ctor中: EnableD2DSupport(); m_pBlackBrush = new CD2DSolidColorBrush(GetRenderTarget(), D2D1::ColorF(D2D1::ColorF::Black)); 现在的问题是,我应该在m_pBlackBrush上调用delete吗?如果是,在哪里?我试着在析构函数中调用delete,但我遇到了一个错误,说存在写访问冲突。有人知道我是应该删除
//在ctor中:
EnableD2DSupport();
m_pBlackBrush = new CD2DSolidColorBrush(GetRenderTarget(), D2D1::ColorF(D2D1::ColorF::Black));
现在的问题是,我应该在m_pBlackBrush上调用delete吗?如果是,在哪里?我试着在析构函数中调用delete,但我遇到了一个错误,说存在写访问冲突。有人知道我是应该删除这个画笔还是干脆离开它(这似乎是一个很奇怪的想法)?这里有一个Direct2D对象工作的小示例:
CChildView::CChildView()
: m_pBitmamLogo(NULL),
m_pBrushBackground(NULL)
{
}
HRESULT CChildView::_LoadBackgroundBrush(CHwndRenderTarget* pRenderTarget)
{
ASSERT_VALID(pRenderTarget);
// Create and load a Direct2D brush from a "PNG" resource
// NOTE: D2D1_EXTEND_MODE_WRAP repeats the brush's content
m_pBrushBackground = new CD2DBitmapBrush(pRenderTarget, // render target
IDB_PNG_BACKGROUND, // resource ID
_T("PNG"), // resource type
CD2DSizeU(0, 0),
&D2D1::BitmapBrushProperties(D2D1_EXTEND_MODE_WRAP,
D2D1_EXTEND_MODE_WRAP));
return m_pBrushBackground->Create(pRenderTarget);
}
CChildView::~CChildView()
{
// No need to free Direct2D resources
// because they are automatically destroyed by the parent render target
}
资料来源:
此构造函数的签名为:
CD2DSolidColorBrush(
CRenderTarget* pParentTarget,
D2D1_COLOR_F color,
CD2DBrushProperties* pBrushProperties = NULL,
BOOL bAutoDestroy = TRUE
);
请注意最后一个参数。从MSDN()中:
bAutoDestroy指示该对象将由所有者(pParentTarget)销毁
当您使用
new
创建此对象时,确实需要删除该对象,否则将导致内存泄漏。这可能取决于您如何使用它。我记得MFC对对象所有权有着奇怪的想法,所以,如果你把画笔放在一个设备上下文中,它可能会拥有所有权。对不起,我记不起细节。@πάνταῥεῖ 你看过我的帖子了吗?我尝试调用delete,但我遇到了错误,这就是我在这里问这个问题的原因。您可以通过确保最后在任何设备上下文或任何其他对象集合的成员中未选择画笔来解决所有权问题。然后,只需删除它。@我们什么也看不到,我只能阅读实际提供的内容。你没有提到任何一个字符,关于你在用指针做什么。正如您的代码片段一样,您必须自己删除对象以避免内存泄漏。您不必调用Create,但感谢您提供的示例