Решение проблемы алиасинга в с ++ - PullRequest
0 голосов
/ 23 июля 2010

Я пытался использовать следующий код, в котором я явно определил copy c'tor, чтобы решить проблему псевдонимов.
Но код выдает ошибку времени выполнения.

#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 Ответ

8 голосов
/ 23 июля 2010

Проблема в этом конструкторе:

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

Здесь вы не выделяете память для копирования строки в переменную str. Но в деструкторе класса вы делаете delete[] str;, так как память для str не выделяется с помощью new[], это происходит сбой. Вам необходимо выделить память, аналогичную той, которую вы делаете в конструкторе копирования, и скопировать строку во вновь выделенную память. Или еще лучше, используйте std::string.

EDIT: Если вы действительно не хотите использовать std::string по какой-либо причине, вам также нужен оператор присваивания с проверкой self assignment , как упомянуто @icabod.

...