c++ - 为什么 wxBLACK_PEN 是 wxPen*?

标签 c++ memory-management wxwidgets

这很丑陋:

wxPaintDC dc(this);
dc.SetPen(*wxBLACK_PEN);
dc.SetBrush(*wxBLACK_BRUSH);

这是因为 dc.SetPen 采用 const wxPen& - 如您所料。我通常在堆栈上创建笔,为什么这个宏扩展为指针? (我期待一个 const wxPen&)

宏扩展为:

wxStockGDI::GetPen(wxStockGDI::PEN_BLACK)

这是工厂吗?它被命名为“Get”而不是“Make”......

我应该删除笔吗?这会使它的使用更加困惑!

它不是 const wxPen* 这支持“工厂”假设。我可以改变它!

为什么它返回一个指针?我应该删除它吗?

只是为了让我看起来不傻:
我认为我应该删除它的原因是它不是 const,如果我改变这支笔我不想改变黑笔本身!所以一定是拷贝!

我刚试过(我不喜欢这样的实验)删除笔不是个好主意! (崩溃)

最佳答案

我用谷歌搜索并找到了 GetPen 的代码。

const wxPen* wxStockGDI::GetPen(Item item)
{
    wxPen* pen = static_cast<wxPen*>(ms_stockObject[item]);
    if (pen == NULL)
    {
        switch (item)
        {
        case PEN_BLACK:
            pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_BLACKDASHED:
            pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxPENSTYLE_SHORT_DASH);
            break;
        case PEN_BLUE:
            pen = new wxPen(*GetColour(COLOUR_BLUE), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_CYAN:
            pen = new wxPen(*GetColour(COLOUR_CYAN), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_GREEN:
            pen = new wxPen(*GetColour(COLOUR_GREEN), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_YELLOW:
            pen = new wxPen(*GetColour(COLOUR_YELLOW), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_GREY:
            pen = new wxPen(wxColour(wxT("GREY")), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_LIGHTGREY:
            pen = new wxPen(*GetColour(COLOUR_LIGHTGREY), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_MEDIUMGREY:
            pen = new wxPen(wxColour(wxT("MEDIUM GREY")), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_RED:
            pen = new wxPen(*GetColour(COLOUR_RED), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_TRANSPARENT:
            pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxPENSTYLE_TRANSPARENT);
            break;
        case PEN_WHITE:
            pen = new wxPen(*GetColour(COLOUR_WHITE), 1, wxPENSTYLE_SOLID);
            break;
        default:
            wxFAIL;
        }
        ms_stockObject[item] = pen;
    }
    return pen;
}

(来自 here)

我想这是为了向调用者报告 new 失败。在古代,new 返回NULL。 (如您所知,如果分配失败,现在 new 将抛出 std::bad_alloc。)

..它的返回类型是const wxPen*。你没看错吧?

关于c++ - 为什么 wxBLACK_PEN 是 wxPen*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423273/

相关文章:

c++ - new/delete 和 malloc/free 有什么区别?

ios - Objective-C/iOS 内存管理问题

c++为什么在将字符串文字传递给函数时分配内存?

c++ - wxWidgets定时器没有启动?

wxwidgets - 使 Boost Python 不删除析构函数中的 C++ 对象

c++ - 在 Ubuntu 上使用 wxWidgets2.9.3 出错

c++ - 模板的部分模板特化

c++ - make/gmake 的条件依赖

c++ - 如何在 Windows (win32) 上获取每个线程的 cpu 使用率

c++ - 使用 RcppArmadilloExtensions/sp_mat.h 从矩阵到 Armadillo 的稀疏矩阵转换