2013-03-01 137 views
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; 
     } 
}; 

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

+0

valgrind --leak-check = full。/ program'的输出是什么? – PSIAlt 2013-03-01 07:33:33

+0

这是在VS2012上运行,我对调试器参数不太熟悉,甚至没有控制台。 – object 2013-03-01 07:38:23

回答

0

我的问题是,它返回一个ID2D1SolidColorBrush代码*替换原为可变色,这是执行一个Create()而不是每次调用它时都会释放,所以刷子会累积起来并变成内存泄漏。

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吗?

+0

当我说内存泄漏时,我可能会想到错误的单词。如果我在任务管理器中观察程序内存使用情况,由于此代码每秒执行至少50-60次,内存使用量将在大约5分钟内接近1,500,000 K.当我注释掉执行该函数的行时,内存不会增加。 – object 2013-03-01 07:25:14

+0

任务管理器不是内存泄漏检测工具。这是非常不准确的 - 尤其是因为CRT通常会缓存来自系统的分配以便稍后快速重新分配。但是,如果您在任务管理器中看到您的程序稳步增加内存使用量,则可能在某处发生泄漏。 – selbie 2013-03-01 07:26:37

+0

是的;起初我不知道泄漏的位置,但经过一些评论后,特别是它被缩小到这个功能。 – object 2013-03-01 07:29:28

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); 

而且,这是值得的东西,如scoped_array

+0

尝试这可能确实使它更安全,但程序的内存使用率仍然以剧烈的速度上升。 – object 2013-03-01 07:30:41