我认为这不需要另外一个问题,所以我正在编辑这个非常相关的问题。
我有一个代码可以通过从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 :(得分: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,因此刷子会堆积并变成内存泄漏。