سؤال

ولقد حددت للتنفيذ بشكل صحيح، لأنني لا أستطيع الحصول عليه للرد على بعض الاشياء التي اقوم. ولكن لا أستطيع الحصول على ApplicationVerifier للكشف بشكل صحيح تسرب مقبض.

وهنا مثال:

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    HANDLE hFile = CreateFile(_T("C:\\test.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
    return 0;
}

وApplicationVerifier لا يكشف هذا.

وماذا يمكنني أن أفعل للكشف عن المشكلة أعلاه؟

هل كانت مفيدة؟

المحلول

هل التعليمات البرمجية خلق مقابض إلا من خلال CreateFile؟ إذا كان الأمر كذلك يمكنك فقط ماكرو هذه الأساليب إلى الإصدارات التي لم تنفذ مخصصة للكشف عن التسرب. انها هناك الكثير من العمل لكنه لن يحصل على هذه المهمة.

#if DEBUG
#define CreateFile DebugCreateFile
#define CloseHandle DebugCloseHandle
#endif
// in another cpp file
#undef CreateFile
#undef CloseHandle
HANDLE DebugCreateFile(...) {
  HANDLE real = ::CreateFile(...);
  TrackHandle(real);
  return real;
}
void DebugCloseHandle(HANDLE target) {
  if (IsTracked(target)) { Untrack(target); }
  ::CloseHandle(target);
}
void CheckForLeaks() {
  // Look for still registered handles
}

وفي نهاية البرنامج كنت بحاجة إلى استدعاء CheckForLeaks. كما قلت رغم ذلك، قدرا كبيرا من العمل لكنها قد تساعد مع scenairo الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top