2016-03-28 3 views
-4

В приложении MFC с использованием Direct2D У меня есть очень простой код:
// в CTOR:Нужно ли мне удалить этот объект?

EnableD2DSupport(); 
m_pBlackBrush = new CD2DSolidColorBrush(GetRenderTarget(), D2D1::ColorF(D2D1::ColorF::Black)); 

Теперь вопрос, я должен позвонить удалить на m_pBlackBrush? Если да, то где? Я попытался вызвать delete на нем в деструкторе, но я получаю сообщение об ошибке, сказанное, что есть нарушение доступа к записи. Кто-нибудь знает, должен ли я удалить эту кисть или просто оставить ее (что кажется довольно странной идеей)?

+3

Уверенный, что вам нужно «удалить» этот объект, когда вы его создали, используя 'new', иначе вы будете иметь утечку памяти. –

+2

Это зависит от того, как вы его используете. Насколько я помню, у MFC были странные идеи об объектной собственности, поэтому, например, если вы поместите эту кисть в контекст устройства, она может взять на себя ответственность. Извините, я не помню подробностей. –

+0

@ πάνταῥεῖ Вы прочитали мое сообщение? Я пытался называть delete, но я получаю ошибку, поэтому я задаю этот вопрос здесь –

ответ

4

Подпись этого конструктора:

CD2DSolidColorBrush(
    CRenderTarget* pParentTarget, 
    D2D1_COLOR_F color, 
    CD2DBrushProperties* pBrushProperties = NULL, 
    BOOL bAutoDestroy = TRUE 
); 

Обратите внимание на последний параметр. Из MSDN (CD2DSolidColorBrush::CD2DSolidColorBrush):

bAutoDestroy
Указывает, что объект будет уничтожен владельцем (pParentTarget).

-1

Вот небольшая выборка объектов 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 
} 

Источник: http://codexpert.ro/blog/2016/01/18/easy-png-resource-loading-with-mfc/

+0

вам не нужно называть Create, но спасибо за пример –

Смежные вопросы