J'ai une implémentation de pointeur automatique:constructeur pointeur automatique en VC2008
template <typename T, bool Arr = false>
class GAutoPtr
{
T *Ptr;
public:
typedef GAutoPtr<T, Arr> &AutoPtrRef;
GAutoPtr(T *ptr = 0)
{
Ptr = ptr;
}
GAutoPtr(AutoPtrRef p)
{
Ptr = p.Release();
}
~GAutoPtr() { Empty(); }
operator T*() { return Ptr; }
T *Get() { return Ptr; }
T *operator->() const { LgiAssert(Ptr); return Ptr; }
inline void Empty()
{
if (Arr)
delete [] Ptr;
else
delete Ptr;
Ptr = 0;
}
AutoPtrRef operator =(GAutoPtr<T> p)
{
Empty();
Ptr = p.Ptr;
p.Ptr = 0;
return *this;
}
void Reset(T *p)
{
if (p != Ptr)
{
Empty();
Ptr = p;
}
}
T *Release()
{
T *p = Ptr;
Ptr = 0;
return p;
}
};
typedef GAutoPtr<char, true> GAutoString;
typedef GAutoPtr<char16, true> GAutoWString;
Et cela fonctionne très bien dans Visual C++ 6. Toutefois, dans Visual C++ 2005 ou 2008, je ne peux pas retourner un pointeur automatique d'une fonction sans les choses vont horriblement mal.
par exemple.
GAutoString Func()
{
char *s = new char[4];
strcpy(s, "asd");
return s;
}
int main()
{
GAutoString a = Func();
/// a.Ptr is now garbage
}
Qu'est-ce qui se passe est que le compilateur crée un GAutoString temporaire pour maintenir la valeur de retour de la fonction, puis en passant que la variable « a » sur la pile Calles l'opérateur T *() de la température variable, puis le constructeur GAutoPtr (T * ptr = 0), au lieu de simplement utiliser le constructeur de copie: GAutoPtr (AutoPtrRef p)
Il en résulte le temp auto ptr la suppression de la mémoire et «un» tenant un pointeur sur la mémoire libérée.
Cependant, dans VC6, il appelle le bon constructeur. Maintenant, en disant tout cela, j'utilise aussi gcc sur Linux et Mac, donc tout code que j'écris doit fonctionner là aussi. VC2008 vous empêche d'utiliser une variable non-const par valeur dans le constructeur de copie. De plus, je ne veux pas de "const", car le constructeur de copie prend possession du bloc de mémoire qui supprime la propriété de l'objet en cours de copie ... le modifiant ainsi.
Comment puis-je faire cela fonctionner dans VC 2005/2008?
Fini par avoir besoin de plus que le mot clé 'explicite', j'ai donc distillé une solution de STL en utilisant la classe auto_ptr_ref. Jusqu'ici tout va bien. – fret