Вы можете сделать следующее
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 на стороне сервера должны совпадать. Надеюсь, это поможет.
Это может быть не фактическая утечка памяти, а, возможно, ситуация увеличения использования памяти. Например, это может быть распределение постоянно увеличивающейся строки:
string s;
for (i=0; i<n; i++)
s += "a";
50 000 не так уж много, может быть, вам следует просмотреть свой источник вручную и посмотреть, что может быть причиной проблемы.
Распространенной причиной этих небольших встроенных устройств является фрагментация памяти. В вашем приложении может быть свободная память между 2 объектами. Распространенным решением этой проблемы является использование выделенного распределителя (оператор new в C ++) для наиболее распространенных классов. Пулы памяти, используемые исключительно для объектов размера N, не фрагментируются - пространство между двумя объектами всегда будет кратно N.
Кроме того, вы уверены, что когда вы профилировали свой код, покрытия кода было достаточно, чтобы охватить все пути кода что может быть выполнено на целевой платформе?
Valgrind точно не лжет. Как уже указывалось, это может быть куча времени выполнения, не освобождающая память, но я бы подумал иначе.
Если ваше использование памяти снижается, я не думаю, что это можно определить как утечку памяти. Где вы получаете отчеты об использовании памяти? Система могла бы просто поместить большую часть памяти вашей программы в виртуальную память.
Все, что я могу добавить, - это то, что Valgrind, как известно, довольно эффективно обнаруживает утечки памяти!
Это может быть не утечка, а просто куча времени выполнения, не высвобождающая память для операционной системы. Это также может быть фрагментация.
Возможные способы преодоления этого:
Разделить на два приложения. Главное приложение будет иметь простую логику с минимальным или нулевым использованием динамической памяти. Это заставит рабочее приложение фактически выполнять работу в таких блоках, что рабочему приложению не будет не хватать памяти, и он будет периодически перезапускать это приложение. Таким образом, память периодически возвращается операционной системе.
Напишите свой собственный распределитель памяти. Например, вы можете выделить выделенную кучу и только выделить память оттуда, а затем полностью освободить выделенную кучу. Это требует от операционной системы поддержки нескольких куч.
Также обратите внимание, что
Это звучит как фрагментация. Фрагментация вызвана размещением объектов в стеке, например:
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 - есть множество ссылок). Это было полезно для записей, хранящихся в мини-базе данных, используемой моей программой.
Используете ли вы какую-либо сложную технику для отслеживания объема объекта ..? если да, то valgrind недостаточно умен, хотя вы можете попробовать установить параметр, связанный с xscale, с помощью valgrind
Большинство приложений демонстрируют схему использования памяти следующим образом:
Если ваше приложение непрерывно увеличивается в размере, вы можете есть утечка Если он увеличивается в размерах в течение апериода и затем достигает относительно устойчивого состояния, вы, вероятно, этого не сделаете.
Вы можете использовать инструмент массива из Valgrind, который покажет вам, где выделено наибольшее количество памяти и как она эволюционирует в течение время.