C++ 类成员内存泄漏

C++ 类成员内存泄漏,c++,string,text,directwrite,C++,String,Text,Directwrite,我不认为这需要另一个问题,所以我正在编辑这个非常相关的问题 我有一个代码,可以通过从char*转换到wchar_t*来绘制文本,我怀疑是内存错误,因为程序内存会以疯狂的速度增长(5000k到1500000分钟) 我怀疑mbstowcs(),但我想我现在发现了问题 一般来说,我用的是一种很糟糕的方法来获得颜色来画东西 class MainClass { public: ID2D1SolidColorBrush* custom_color; ID2D1Soli

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

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

我怀疑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;
        }
};
几乎可以肯定的是,内存使用量的增加来自这个函数。
有没有更好的方法可以返回像这样的自定义颜色?

您看起来实际上没有内存泄漏。内存泄漏工具报告的许多“泄漏”有时是误报。但是,有一个简单的修复方法可以消除NXT可能的泄漏。由于您每次分配的是固定数量(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吗?

看起来不像是内存泄漏。但可能存在危险行为: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);

另外,用类似于作用域数组的东西替换rawnew也是值得的。我的问题是,一个代码返回ID2D1SOLIDCORBRUSH*作为颜色变量,它在执行Create(),而不是每次调用它时都执行Release,所以刷子会堆积起来并变成内存泄漏。

那么,当我说内存泄漏时,我可能想到了错误的单词。如果我在任务管理器中观察程序内存使用情况,由于该代码每秒至少执行50-60次,内存使用情况将在大约5分钟内接近1500000 K。当我注释掉执行函数的行时,内存不会增加。任务管理器不是内存泄漏检测工具。这是非常不准确的-特别是因为CRT通常会缓存来自系统的分配,以便稍后快速重新分配。然而,如果您在任务管理器中看到您的程序内存使用率稳步上升,那么您可能在某个地方发生了泄漏;起初我不知道泄漏在哪里,但经过一些评论后,它被缩小到了这个函数的范围;我在文章中重写了代码,以便使用new[]和delete[]更具意义。msbtowcs不保证空终止。mbtowcs返回后,将ntxt[size-1]初始化为零。(断言大小总是>=1当然)。尝试这样做可能会使它更安全,但程序的内存使用率仍然以惊人的速度增长。valgrind--leak check=full./program的输出是什么??这是在VS2012上运行的,我对调试器的参数不太熟悉,更不用说控制台了。。