2 votes

Démonstration du constructeur de copie (plantage... cas 2)

Jetez un coup d'œil à ce programme :

class CopyCon
{
public:
char *name;

CopyCon()
{ 
    name = new char[20];        
    name = "Hai";//_tcscpy(name,"Hai");
}

CopyCon(const CopyCon &objCopyCon)
{
    name = new char[_tcslen(objCopyCon.name)+1];
    _tcscpy(name,objCopyCon.name);
}

~CopyCon()
{
    if( name != NULL )
    {
        delete[] name;
        name = NULL;
    }
}
};

int main()
{
    CopyCon obj1;
    CopyCon obj2(obj1);
    cout<<obj1.name<<endl;
    cout<<obj2.name<<endl;
}

Ce programme se bloque à l'exécution. Erreur : "Expression : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)"

Si j'assigne "Hai" au nom en utilisant l'opérateur d'alignement, il se bloque. Alors que lorsque j'utilise le func string _tcscpy pour assigner "Hai" au nom, il fonctionne parfaitement. Quelqu'un peut-il m'expliquer pourquoi ?

0voto

PeterK Points 4218

Ce que vous faites dans ce code, c'est que vous allouez un bloc de mémoire pour le nom (en assignant une adresse au pointeur du nom). Puis vous écrasez cette adresse par l'adresse de la chaîne littérale "Hai" (qui cesse d'exister après la fin du constructeur). C'est pourquoi vous obtenez l'erreur, puisque le destructeur essaie de libérer la mémoire qui ne vous appartient pas. (Vous ne l'avez pas allouée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X