Было огромное поток относительно включения/отключения утверждений в сборках конечных версий на comp.lang.c ++. модерируемый, который, если у Вас есть несколько недель, Вы видите, как варьировался, мнения об этом. :)
Вопреки coppro, я полагаю, что, если Вы не уверены, что утверждение может быть отключено в сборке конечных версий, затем это не должно было быть утверждение. Утверждения состоят в том, чтобы защитить от повреждаемых инвариантов программы. В таком случае, насколько клиент Вашего кода обеспокоен, что будет один из двух возможных результатов:
нет никакого различия для пользователя, однако, возможно, что утверждения добавляют ненужную стоимость производительности в коде, который присутствует в подавляющем большинстве выполнений, где код не перестал работать.
ответ на вопрос на самом деле зависит намного больше от того, кем будут клиенты API. Если Вы пишете библиотеку, обеспечивающую API, то Вам нужна некоторая форма механизма, чтобы уведомить Ваших клиентов, что они использовали API неправильно. Если Вы не предоставляете две версии библиотеки (один с, утверждает, один без) затем утверждают, очень маловероятно соответствующий выбор.
Лично, однако, я не уверен, что пошел бы за исключениями для этого случая также. Исключения лучше подходят туда, где подходящая форма восстановления может произойти. Например, может случиться так, что Вы пытаетесь выделить память. Когда Вы ловите 'станд.:: bad_alloc' исключение это могло бы быть возможно к свободному память и попробовать еще раз.
Все модули Indy имеют префикс «Id», поэтому проверьте, есть ли у вас какой-либо из них в ваших разделах uses.
Другой способ - разместить точку останова в TIdStack.create () . В конце концов, виновный появится в стеке вызовов.
В сети много об этом, хотя и разрозненно. Это также зависит от того, используете ли вы Indy 9 (с D7) или новее. Меня это тоже осуждает. Для Indy 9 я сделал следующее в IdComponent.pas:
initialization
GStackCriticalSection := TCriticalSection.Create;
// BJF Starts
//RegisterExpectedMemoryLeak(GStackCriticalSection);
// BJF Ends
finalization
// Dont Free. If shutdown is from another Init section, it can cause GPF when stack
// tries to access it. App will kill it off anyways, so just let it leak
// BJF has removed comments
FreeAndNil(GStackCriticalSection);
end.
Но учтите, что вы должны указать путь к исходному тексту Indy в пути к библиотеке. Я считаю, что Indy 10 исправлен в этом отношении. Брайан
Посмотрите на использование в вашем .dpr Используйте cnPack (cnPack.org) и выберите «Uses Cleaner», чтобы удалить блоки, на которые нет ссылок
Диспетчер памяти Delphi FastMM предоставляет метод
function RegisterExpectedMemoryLeak(P: Pointer): boolean;
Итак, если вы нашли модуль и оказалось, что вы не можете его удалить, вы можете использовать этот метод для подавления утечки памяти. предупреждение.