内存泄漏与类成员

时间:2013-03-01 07:07:26

标签: c++ string text directwrite

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

我有一个代码可以通过从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;
        }
};

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

3 个答案:

答案 0 :(得分: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调用指定“size”作为要复制的字符的最大数量,但是硬编码为250作为长度。你确定你确定“尺寸”总是小于250吗?

答案 1 :(得分:0)

因为你有内存泄漏所以它看起来不像。但是可能存在危险的behaiour: 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);

此外,值得用 scoped_array

替换原始的 new

答案 2 :(得分:0)

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