2010-07-23 4 views
0

J'essayais de suivre le code dans lequel j'ai défini copy c'tor explicitement pour résoudre le problème d'aliasing.
Mais le code génère une erreur d'exécution.Résoudre le problème d'aliasing en C++

#include<iostream> 
#include<cstring> 
using namespace std; 

class word 
{ 
    public: 
    word(const char *s) // No default c'tor 
    { 
     str=const_cast<char*>(s); 
     cnt=strlen(s); 
    } 
    word(const word &w) 
    { 
     char *temp=new char[strlen(w.str)+1]; 
     strcpy(temp,w.str); 
     str=temp; 
     cnt=strlen(str); 
    } 
    ~word() 
    { 
    delete []str; 
    cout<<"destructor called"<<endl; 
    } 
    friend ostream& operator<<(ostream &os,const word &w); 

private: 
    int cnt; 
    char *str; 
}; 

ostream& operator<<(ostream &os,const word &w) 
{ 
    os<<w.str<<" "<<w.cnt; 
    return os; 
} 

word noun("happy"); 
void foo() 
{ 
    word verb=noun; 
    cout<<"inside foo()"<<endl; 
    cout<<"noun : "<<noun<<endl<<"verb : "<<verb<<endl; 
} 

int main() 
{ 
    cout<<"before foo()"<<endl<<"noun : "<<noun<<endl; 
    foo(); 
    cout<<"after foo()"<<endl<<"noun : "<<noun<<endl; 
    return 0; 
} 
+1

Quelle est l'erreur d'exécution? – TheJuice

+2

Naveen vous a déjà montré une erreur. Un autre est que votre classe manque un opérateur d'affectation. (Google pour "règle de trois".) Pourquoi faites-vous cela de toute façon? __Pourquoi ne pas utiliser 'std :: string'? __12 – sbi

+0

@sbi probablement devoirs :) – corsiKa

Répondre

8

Le problème est dans ce constructeur:

word(const char *s) // No default c'tor 
    { 
     str=const_cast<char*>(s); 
     cnt=strlen(s); 
    } 

Vous n'allouez une mémoire pour copier la chaîne dans la variable str. Mais dans destructor de la classe vous faites delete[] str;, puisque la mémoire pour le str n'est pas allouée en utilisant new[] il plante. Vous devez allouer une mémoire similaire à celle que vous utilisez dans le constructeur de copie et copier la chaîne dans la nouvelle mémoire allouée. Ou mieux encore, utilisez std::string.

EDIT: Si vous ne voulez vraiment pas utiliser std::string pour une raison quelconque, vous devez également un opérateur d'affectation avec chèque self assignment comme mentionné par @icabod.

+0

Il convient également de souligner qu'il n'y a pas d'opérateur d'affectation, donc dans la méthode "foo()", vous finirez par essayer de supprimer les données pointées par "nom" de toute façon. Si vous jouez avec des pointeurs dans une classe, vous avez vraiment besoin d'un "opérateur =". – icabod

+0

@icabod .. Pourquoi ai-je besoin d'opérateur = parce que dans foo(), je crée un nouvel objet, ne l'assignant à aucun construit précédemment. –

+2

@Happy Mittal: Vous ne l'utilisez pas dans ce code, mais cela ne signifie pas que vous ne l'utiliserez pas demain. Lorsque vous écrivez une classe et que vous y écrivez un constructeur de copie, vous * devriez * écrire aussi un opérateur d'affectation. – Naveen

Questions connexes