Утечки памяти с учениками

Я не думаю, что это требует другого вопроса, поэтому я редактирую этот чрезвычайно важный вопрос.

У меня был код, который рисовал бы текст путем преобразования из char * в wchar_t *, и я подозревал ошибку памяти, поскольку память программы росла сумасшедшим темпом (от 5 000 К до 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

Решение

У вас, похоже, нет утечки памяти. И многие «утечки», о которых сообщают инструменты утечки памяти, иногда являются ложными срабатываниями. Тем не менее, есть одно простое исправление, чтобы устранить 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?

1

Другие решения

Это не выглядит, как у вас утечка памяти. Но может быть опасное поведение mbstowcs принимает максимальную длину wchar_t в Dest, но вы даете длину строки. Исправить для этого:

    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

Моя проблема заключалась в коде, который возвращает ID2D1SolidColorBrush * в качестве переменной цвета, которая выполняла Create (), а не Release каждый раз, когда ее вызывали, поэтому кисти накапливались и превращались в утечки памяти.

0
По вопросам рекламы [email protected]