La libération de la mémoire allouée dans une autre DLL

J'ai un fichier EXE en utilisant un fichier DLL qui est d'utiliser un autre fichier DLL. Cette situation a été soulevée:

En fichier DLL 1:

class abc
{
    static bool FindSubFolders(const std::string & sFolderToCheck, 
                               std::vector< std::string > & vecSubFoldersFound);
}

En fichier DLL 2:

void aFunction()
{
    std::vector<std::string> folders;
    std::string sLocation;
    ...
    abc::FindSubFolders(sLocation, folders)
}

En mode release, tout fonctionne bien. Mais en mode debug, je viens avec un échec d'assertion dans le destructeur de l'un des std::strings dans les dossiers vecteur (lorsque les dossiers sont est hors de portée à la fin de aFunction):

dbgheap.c : line 1274

/*
 * If this ASSERT fails, a bad pointer has been passed in. It may be
 * totally bogus, or it may have been allocated from another heap.
 * The pointer MUST come from the 'local' heap.
 */
_ASSERTE(_CrtIsValidHeapPointer(pUserData));

Je suppose que c'est parce que la mémoire a été allouée sur le fichier DLL 1 du tas, mais est libéré dans le fichier DLL 2.

Le commentaire dans dbgheap.c semble assez insisté sur le fait que c'est un problème.

Pourquoi est-ce un tel problème, quand il semble que cela fonctionne bien si je l'ignore tout simplement? Est-il un non-affirmation-à défaut de moyen de le faire?

N' . Les IGNORER . Les ASSERTIONS
PAS. En l'IGNORANT. C'. C'EST. POURQUOI. I. DEMANDÉ. =P
Je veux juste savoir pourquoi c'est un problème.

OriginalL'auteur Smashery | 2009-10-28