Змінив char str[], на вказівник char* str, хотів запропонувати, але подумав що ти сам до цього дійдеш. Взагалі молодець. ![:)](https://replace.org.ua/extensions/nya_smiles/img/ab.gif)
Тепер зауваження.
1. Про ініціалізацію об’єктів. Запам’яти просто, якщо ти ініціюєш змінну без new, то вона живе до виходу за межі її видимості.
{
{
int aaa;
...
}
// тут змінної вже aaa і не видно і її немає, вона знищена
}
Але якщо ти використовуєш операцію new, то змінна розташовується в "кучі" (це така область пам’яті) і тобі повертається вказівник на цю змінню в кучі.
{
{
int* bbb = new (int);
...
// тут ти может дістатися створеного об’єкта в кучі через вказівник bbb
}
// тут вже bbb не видно, але об’єкт в кучі залишився, бо ти його не видалив
}
якщо тобі вже не потрібен об’єкт, створенний оператором new, його потрібно видалити оператором delete, інакше пам’ять в кучі так і залишиться занятою.
Правило просте - new і delete завжди ходять в парі. Якщо об’єкт створюється за допомогою оператора new то він повинен знищуватись за допомогою оператора delete. Для знащиення масива, створеного за допомогою new, використовуються оператор delete[], не плутати!
{
{
int* bbb = new (int);
...
// тут ти может дістатися створеного об’єкта в кучі через вказівник bbb
delete bbb; // вказівник ще є, але об’єкт на який він вказує вже знищено
}
// тут вже bbb не видно, але об’єкт в кучі залишився, бо ти його не видалив
}
2. Стрічки C-типу (що являють собою массив char) по-хорошому повинні закінчуватися на символ "термінальний нуль" - '\0', бо саме цей символ вважається кінцем стрічки в багатьох операціях і в << в тому числі. Тому, коли ти з’єднуєш дві свої стрічки то розмір роби на одиницю більшим і в кінець став термінальний нуль. В тебе такий розмір дивний і виходить бо strlen шукає термінальний нуль в массиві і їй байдуже що він закнічився.
Це основні зауваження.
На бутер вже є. Навіть з ікрою. З кількома ікринками ![:)](https://replace.org.ua/extensions/nya_smiles/img/ab.gif)