Bonjour,
Comme tout le monde, je connais en gros le rôle des flags /MT et /MD pour le "code generation" dans VS++. Toutefois, je suis curieux de savoir ce qu'il se passe en interne si l'on choisit l'un ou l'autre, notamment pour comprendre un problème qui me bloque actuellement.
- j'ai une lib et sa DLL associée en /MT. Plus précisément, il s'agit de ChromiumEmbedded Framework (CEF)
- j'ai mon EXE en /MT qui utilise cette lib/dll
- j'ai une DLL à moi, en /MT évidemment, linkée aussi à CEF
Ma DLL reçoit en paramètre un objet issu de CEF, appelle une méthode de cet objet qui génère un objet CefString:
Tout se passe bien jusqu'à la libération à la fin du scope de la fonction : il y a un assert sur _CrtIsValidHeapPointer. Cela indique que ma DLL appelle le destructeur de str qui cherche à libérer de la mémoire qui a été allouée dans heap différent du sien (celui de l'EXE à priori.. ou de la DLL CEF ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 MyDLL.cpp : bool MyFunction(CefObject* pObj) { CefString str = pObj->createString(); ... return(true); }
Lorsque je build en /MD, tout se passe bien.
Ma conclusion serait la suivante :
- en /MT, le chargement d'une DLL implique que l'EXE appelant et la DLL sont chacun dans leur zone mémoire et personne n'a le droit d'aller jouer dans le terrain de l'autre.
- en /MD, la DLL s'intègre naturellement dans l'espace mémoire de l'EXE et tout va bien lorsqu'il y a allocation/désallocation par l'un ou l'autre.
J'ai bon ou je raconte n'importe quoi ?
Avez vous des liens qui expliquent plus clairement ce qui se passe avec /MT et /MD ?
Merci
Antoine
Partager