0

我认为这不需要另一个问题,所以我正在编辑这个非常相关的问题。

我有一个代码可以通过从 char* 转换为 wchar_t* 来绘制文本,我怀疑是内存错误,因为程序内存会以疯狂的速度增长(5,000 K 到 1,500,000 分钟)。

我怀疑 mbstowcs(),但我想我现在发现了问题。

我正在使用一种相当糟糕的方式来获取颜色来绘制一般的东西。

class MainClass {
    public:
        ID2D1SolidColorBrush* custom_color;
        ID2D1SolidColorBrush  get_rgba(float r, float g, float b, float a) {
            // render is a validated ID2D1RenderTarget*
            render->CreateSolidColorBrush(D2D1::ColorF(r,g,b,a),&custom_color);
            return custom_color;
        }
};

几乎可以肯定,内存使用量的增加来自此功能。有没有更好的方法可以返回这样的自定义颜色?

4

3 回答 3

1

您似乎实际上没有内存泄漏。而且内存泄漏工具报告的许多“泄漏”有时是误报。但是,有一个简单的解决方法可以消除 nxtx 作为可能的泄漏。由于您每次都分配固定数量(250 个字符),因此您可以轻松地从堆栈中分配它:

    const int MY_MAX_STRING_SIZE = 1000;
    wchar_t ntxt[MY_MAX_STRING_SIZE]; // simple stack allocation
    mbstowcs(ntxt,text.c_str(),MY_MAX_STRING_SIZE);
    ntxt[MY_MAX_STRING_SIZE-1] = 0; //insure null termination
    render->DrawTextA(ntxt,text.length(),font,trect,color);
}

我注意到的一件事是您的 mbstowc 调用将“大小”指定为要复制的最大字符数,但硬编码 250 作为长度。你确定你确定“大小”总是小于 250 吗?

于 2013-03-01T07:21:44.003 回答
0

它不像你有内存泄漏。但可能存在危险行为:mbstowcs接受 dest 中wchar_t的最大长度,但您提供字符串长度。修复此问题:

    int size=text.length()+1;
    enum { NTXT_LEN = 250 };
    wchar_t* ntxt= new wchar_t[NTXT_LEN];
    mbstowcs(ntxt, text.c_str(), NTXT_LEN);

此外,值得将 raw new替换为scoped_array之类的东西

于 2013-03-01T07:24:17.470 回答
0

我的问题是在返回 ID2D1SolidColorBrush* 作为颜色变量的代码中,每次调用它时都会执行 Create() 而不是 Release,因此画笔会堆积起来并变成内存泄漏。

于 2013-03-01T23:08:10.460 回答