Question

a rencontré un problème lors de la migration de notre code C ++ de VS2008 à VS2010. Je ne peux pas trouver une explication à la raison jusqu'à présent et apprécierai votre aide.

Nous avons un allocateur de mémoire personnalisé et il réside dans une dll. Dans le reste du code que nous utilisons le préprocesseur pour rediriger les allocations à nos fonctions. Thie simple code suivant compile correctement dans VS2008, mais ne pas VS2010.

stdafh.h:

#define free my_free
#include <string>

VS2010 que je reçois:

1>d:\program files\microsoft visual studio 10.0\vc\include\xdebug(62): error C3861: 'free': identifier not found

En provenance de la ligne:

template<class _Ty>
    void __CLRCALL_OR_CDECL _DebugHeapDelete(_Ty *_Ptr)
    {   // delete from the debug CRT heap even if operator delete exists
    if (_Ptr != 0)
        {   // worth deleting
        _Ptr->~_Ty();
        // delete as _NORMAL_BLOCK, not _CRT_BLOCK, since we might have
        // facets allocated by normal new.
        free(_Ptr);

Toute aide ou idées sera très appréciée!

Moshe

Était-ce utile?

La solution 2

Après une enquête en utilisant l'option / P pour créer les fichiers de préprocesseur et de les étudier, j'ai trouvé la cause du problème.

L'en-tête xdebug, qui se décrit comme « en-tête de débogage de support de tas pour Microsoft », contient les lignes suivantes:

#pragma push_macro("free")
#undef free

que la défaite évidemment nos tentatives de le redéfinir. Donc, ce n'est pas quelque chose de nouveau au compilateur, juste #undef ordinaire qui arrive à se produire avec les fonctions que nous essayons de redéfinir

Autres conseils

Selon la norme ISO C ++, section 17.4.3.1.1.2:

  

Une unité de traduction qui comprend un en-tête ne doit pas contenir de macros qui définissent les noms déclarées ou définis dans cet en-tête. Il ne pourra unité de traduction définir des macros pour les noms lexicalement identiques à des mots clés.

Cela signifie que ce n'est pas légal de #define un nom de fonction bibliothèque pour signifier autre chose. Je suppose que cela vient de se passer au travail dans VS2008, mais lors de la migration à VS2010 les auteurs du compilateur venu avec une implémentation dans laquelle cela ne fonctionne pas correctement.

Si vous voulez redéfinir ce free fait, je vous suggère de le faire à travers un canal plus classique en liant le code contre votre propre implémentation de la bibliothèque C qui modifie le comportement par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top