Memory leaks compiling C++ MFC App in debug mode

Strategic Leak Avoidance: Handling OpenCV Memory Leaks in MFC

I am posting this in 2026 for anyone struggling with this issue. After trying various methods, I’ve found that the most effective approach is Strategic Leak Avoidance.

The Root Cause

In MFC, these “leaks” often occur because OpenCV utilizes global memory pools or thread managers (like TBB/OpenMP) for performance optimization. These components are typically cleaned up only when the program is fully unloaded from memory (DLL Unload). Because MFC’s leak detector runs before this final cleanup, it incorrectly flags these internal OpenCV structures as active leaks.

The Solution

The strategy is to temporarily disable memory leak detection just before OpenCV’s DLL is first loaded and initialized. This prevents the initial internal allocations from being tracked.

Implementation Example

You can implement this in your InitInstance() or within the App constructor:

BOOL CMyProjectApp::InitInstance() {
    // [Start: Strategic Leak Avoidance]
    
    // 1. Save the current memory tracking state and turn off the Allocation flag
    int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    _CrtSetDbgFlag(nOldState & ~_CRTDBG_ALLOC_MEM_DF);

    // 2. Force OpenCV Initialization (call any simple function)
    // Internal memory allocated here won't be recorded as a leak!
    try {
        cv::Mat temp(10, 10, CV_8UC1); 
    } catch (...) {}

    // 3. Restore the memory tracking state to its original value
    _CrtSetDbgFlag(nOldState);

    // [End: Strategic Leak Avoidance]
    // From this point forward, any leaks in your own code will be correctly detected.
    
    // ... rest of your code
}

Essential Configuration

For this method to work, you must configure your project to delay the loading of the OpenCV binaries.

  • Go to: Project Properties > Linker > Input > Delay Loaded DLLs

  • Add the OpenCV DLL name (e.g., opencv_world4120d.dll).

By doing this, the DLL is loaded exactly when you call the dummy cv::Mat while tracking is off, rather than at application startup.