Я сейчас делаю упражнение, поэтому сразу скажу, что не хочу использовать 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.Спасибо!