Бих искал да създам проект с активиран детектор за изтичане на памет на Visual Studio (Детектор за изтичане на памет)
Винаги работеше добре и можех лесно да намеря течове на памет, като пусна куп тестове на моето приложение и след това проверих отчета.
Но след статично свързване на OpenCV 3.0 с моя проект получих някои фалшиви положителни резултати.
Например най-разочароващата грешка идва от StereoBMImpl::compute
метод и извикване: ocl::useOpenCL()
След отстраняване на грешки открих източника на "теча":
TLSData<CoreTLSData>& getCoreTlsData()
{
static TLSData<CoreTLSData> *value = new TLSData<CoreTLSData>();
return *value;
}
След като анализирахме този код, знаем, че статичният обект се разпределя само веднъж и всичко трябва да е наред. Но сега имам куп фалшиви положителни доклади за изтичане на памет като:
{1370349} normal block at 0x0E74D560, 24 bytes long.
Data: < > FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00
{1370348} normal block at 0x0E74D4E0, 64 bytes long.
Data: <` t > 60 D5 74 0E CD CD CD CD CD CD CD CD CD CD CD CD
И сега е много трудно да намеря някои реални течове на памет в моето приложение, защото има набор от фалшиви положителни резултати от OpenCV. Не мога също да стартирам автоматични тестове за изтичане на памет, защото изходът винаги съдържа някои течове.
Има ли някакъв начин за премахване на тези "псевдо" грешки (ако е възможно без промяна на изходния код на OpenCV)? Много е досадно.
Предполагам, че други детектори за течове на памет също ще докладват за някои подобни псевдо течове, защото операторът new
се изпълнява без delete
(обектът се почиства автоматично от операционната система).
getCoreTlsData()
, за да прехвърлите изрично тип блок към оператора за отстраняване на грешки new, напр.new (_IGNORE_BLOCK, __FILE__, __LINE__) TlsData<CoreTLSData>()
. Като алтернатива (но по-грозно), можете сами да освободите блока, преди да извършите проверката за теч, чрезdelete &getCoreTlsData();
. Но това ще изисква внимателно определяне на времето: трябва да се уверите, че сте направили това, след като OpenCv приключи с използването му. - person James McNellis   schedule 05.10.2015