C ++ неявное преобразование класса в char * - PullRequest
0 голосов
/ 02 декабря 2018

Я сейчас делаю упражнение, поэтому сразу скажу, что не хочу использовать std :: string для решения моей проблемы.

У меня есть простой класс, в котором есть несколькополя и среди них есть текстовое поле char *, которое можно назначать и переписывать или перераспределять.

class MyClass
{
private:
  char* name;
...
public:
  operator char*() const { return name;}
}

Я пытаюсь сделать неявное преобразование в char *, чтобы я могсделайте это в моей программе:

Myclass s = "Hello"    //allocates 6 bytes and pust a 0-terminated "Hello/0" line into "name"

char* c = s

s = "Hello World"      //re-allocates memory, frees previous memory

cout << "Str: " << s << " Char: " << c;

Очевидно, как я заметил еще до тестирования, когда происходит перераспределение «имени» и освобождается память - «с» теперь указывает на мусор.Так что этот код не используется, и я полностью понимаю, почему.

Я мог бы выделить новую память и вернуть указатель на нее, я думаю:

operator char*() const
{
  int length = strlen(name)+1;
  char* ptr = new char[length]
  std::copy(name, name+length, ptr);
  return ptr;
}

но в этом случае, если япозже переназначить «с» на что-то другое - тогда память никогда не освободится, верно?Если я сделаю это:

c = "Bye";

, то в основном память, в которую я скопировал «имя», все равно останется выделенной и будет выделена?

Вопрос: как сделать это правильно?Стоит ли мне даже беспокоиться об этом или я просто предполагаю, что пользователь, который переназначает «c», должен сначала позаботиться об очистке памяти?

Я повторю, что моя цель состоит в том, чтобы сделать это посредством манипулирования памятьюи указатели, а не безопасно использовать std :: string.Спасибо!

...