Утечка памяти в C++

Вы можете сделать следующее

  if (data.errors){
        for (let key in data.errors) {
                        $('#' + data.errors[key][0] + '-error').text(data.errors[key][1]);  // key in your case is email,password2
                    }
                return false;
}

В html

<div class="form-group">
                <label for="name">Name*</label>
                <input class="form-control" id="name" required="required" name="name" type="text" value="">
                <span class="error" id="name-error"></span>
            </div>
            <div class="form-group">
                <label for="contact-email">Email*</label>
                <input class="form-control" id="email" required="required" name="email" type="text" value="">
                <span class="error" id="email-error"></span>  // here id is email-error so you must must email key in error return by server.
            </div>

. В этом случае помните, что id в span и key на стороне сервера должны совпадать. Надеюсь, это поможет.

6
задан sharptooth 20 April 2009 в 09:11
поделиться

9 ответов

Это может быть не фактическая утечка памяти, а, возможно, ситуация увеличения использования памяти. Например, это может быть распределение постоянно увеличивающейся строки:

string s;
for (i=0; i<n; i++)
  s += "a";

50 000 не так уж много, может быть, вам следует просмотреть свой источник вручную и посмотреть, что может быть причиной проблемы.

3
ответ дан 8 December 2019 в 13:49
поделиться

Распространенной причиной этих небольших встроенных устройств является фрагментация памяти. В вашем приложении может быть свободная память между 2 объектами. Распространенным решением этой проблемы является использование выделенного распределителя (оператор new в C ++) для наиболее распространенных классов. Пулы памяти, используемые исключительно для объектов размера N, не фрагментируются - пространство между двумя объектами всегда будет кратно N.

10
ответ дан 8 December 2019 в 13:49
поделиться

Кроме того, вы уверены, что когда вы профилировали свой код, покрытия кода было достаточно, чтобы охватить все пути кода что может быть выполнено на целевой платформе?

Valgrind точно не лжет. Как уже указывалось, это может быть куча времени выполнения, не освобождающая память, но я бы подумал иначе.

0
ответ дан 8 December 2019 в 13:49
поделиться

Если ваше использование памяти снижается, я не думаю, что это можно определить как утечку памяти. Где вы получаете отчеты об использовании памяти? Система могла бы просто поместить большую часть памяти вашей программы в виртуальную память.

Все, что я могу добавить, - это то, что Valgrind, как известно, довольно эффективно обнаруживает утечки памяти!

0
ответ дан 8 December 2019 в 13:49
поделиться

Это может быть не утечка, а просто куча времени выполнения, не высвобождающая память для операционной системы. Это также может быть фрагментация.

Возможные способы преодоления этого:

  1. Разделить на два приложения. Главное приложение будет иметь простую логику с минимальным или нулевым использованием динамической памяти. Это заставит рабочее приложение фактически выполнять работу в таких блоках, что рабочему приложению не будет не хватать памяти, и он будет периодически перезапускать это приложение. Таким образом, память периодически возвращается операционной системе.

  2. Напишите свой собственный распределитель памяти. Например, вы можете выделить выделенную кучу и только выделить память оттуда, а затем полностью освободить выделенную кучу. Это требует от операционной системы поддержки нескольких куч.

Также обратите внимание, что

3
ответ дан 8 December 2019 в 13:49
поделиться

Это звучит как фрагментация. Фрагментация вызвана размещением объектов в стеке, например:

object1
object2
object3
object4

И затем удаление некоторых объектов

object1

object3
object4

Теперь у вас есть дыра в памяти, которая не используется. Если вы выделите другой объект, слишком большой для отверстия, отверстие останется потраченным впустую. В конечном счете, при достаточном оттоке памяти вы можете получить столько дыр, что они тратят впустую вашу память.

Чтобы обойти это, попробуйте заранее определить ваши требования к памяти. Если у вас есть конкретные объекты, о которых вы знаете, что создаете много, попробуйте и убедитесь, что они имеют одинаковый размер.

Вы можете использовать пул, чтобы сделать распределение более эффективным для определенного класса ... или, по крайней мере, Позвольте вам лучше отследить его, чтобы вы могли понять, что происходит, и найти хорошее решение.

Один из способов сделать это - создать одну статическую переменную:

struct Slot
{
    Slot() : free(true) {}
    bool free;
    BYTE data[20];  // you'll need to tune the value 20 to what your program needs
};
Slot pool[500]; // you'll need to pick a good pool size too.

Создать пул заранее, когда ваша программа запускается и предварительно распределите его так, чтобы он был максимально допустимым для вашей программы. Вы можете захотеть HeapAlloc его (или эквивалент в вашей ОС, чтобы вы могли контролировать, когда он появляется откуда-то при запуске приложения).

Затем переопределите операторы new и delete для подозрительного класса, чтобы они возвращали слоты из этого вектор. Таким образом, ваши объекты будут храниться в этом векторе.

Вы можете переопределить new и удалить для классов того же размера, которые будут помещены в этот вектор.

Создать пулы разных размеров для разных объектов.

Просто перейдите сначала для худших.

Я делал что-то подобное раньше, и это решило мою проблему на встроенном устройстве. Я также использовал много STL, поэтому я создал собственный распределитель (google для stl custom allocator - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.

Затем переопределите операторы new и delete для подозрительного класса, чтобы они возвращали слоты из этого вектора. Таким образом, ваши объекты будут храниться в этом векторе.

Вы можете переопределить new и удалить для классов того же размера, которые будут помещены в этот вектор.

Создать пулы разных размеров для разных объектов.

Просто перейдите сначала для худших.

Я делал что-то подобное раньше, и это решило мою проблему на встроенном устройстве. Я также использовал много STL, поэтому я создал собственный распределитель (google для stl custom allocator - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.

Затем переопределите операторы new и delete для подозрительного класса, чтобы они возвращали слоты из этого вектора. Таким образом, ваши объекты будут храниться в этом векторе.

Вы можете переопределить new и удалить для классов того же размера, которые будут помещены в этот вектор.

Создать пулы разных размеров для разных объектов.

Просто перейдите сначала для худших.

Я делал что-то подобное раньше, и это решило мою проблему на встроенном устройстве. Я также использовал много STL, поэтому я создал собственный распределитель (google для stl custom allocator - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.

Создавайте пулы разных размеров для разных объектов.

Сначала пойдите для худших нарушителей.

Я делал что-то подобное раньше, и это решило мою проблему на встроенном устройстве. Я также использовал много STL, поэтому я создал собственный распределитель (google для stl custom allocator - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.

Создавайте пулы разных размеров для разных объектов.

Сначала пойдите для худших нарушителей.

Я делал что-то подобное раньше, и это решило мою проблему на встроенном устройстве. Я также использовал много STL, поэтому я создал собственный распределитель (google для stl custom allocator - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.

1
ответ дан 8 December 2019 в 13:49
поделиться

Используете ли вы какую-либо сложную технику для отслеживания объема объекта ..? если да, то valgrind недостаточно умен, хотя вы можете попробовать установить параметр, связанный с xscale, с помощью valgrind

0
ответ дан 8 December 2019 в 13:49
поделиться

Большинство приложений демонстрируют схему использования памяти следующим образом:

  • они очень мало используют при запуске
  • поскольку они создают структуры данных, они используют все больше и больше
  • , когда они начинают удалять старые структуры данных или повторно использовать существующие, они достигают устойчивого состояния, когда использование памяти остается примерно постоянным

Если ваше приложение непрерывно увеличивается в размере, вы можете есть утечка Если он увеличивается в размерах в течение апериода и затем достигает относительно устойчивого состояния, вы, вероятно, этого не сделаете.

0
ответ дан 8 December 2019 в 13:49
поделиться

Вы можете использовать инструмент массива из Valgrind, который покажет вам, где выделено наибольшее количество памяти и как она эволюционирует в течение время.

0
ответ дан 8 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: