Форум программистов, компьютерный форум CyberForum.ru

Конкатенация строк в объектах - C++

Восстановить пароль Регистрация
 
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
13.01.2014, 21:56     Конкатенация строк в объектах #1
Программа завершает свою работу в тот момент, когда выполняет нижеприведенный фрагмент кода. Вывода на экран не происходит. Вкратце условия задачи:
Класс String состоит из указателя на строку char*str в private и нескольких функций в public, но вопрос мой касается лишь одной из них.
Определение функции:
C++
1
2
3
4
5
6
7
8
9
10
11
String String::operator+(const String&v)
{
char*temp=new char[strlen(str+1)]; // создаем временный указатель
strcpy(temp,str);
delete [] str;
str = new char [strlen(str)+strlen(v.str+1)];
strcpy(str,temp);
strcat(str,v.str);
delete[]temp;
return *this;
}
код в main() :
C++
1
2
3
4
  String s1(" My name is Mike ");
    String s2 = " and I am a C++ student. ";
    s1=s1+s2;
    cout << s1;
С перегруженным оператором вывода << все в порядке, в других частях кода работает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 21:56     Конкатенация строк в объектах
Посмотрите здесь:

C++ Конкатенация строк
C++ Конкатенация строк
Конкатенация строк C++
C++ Копирование строк в объектах
конкатенация строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,910
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 21:59     Конкатенация строк в объектах #2
C++
1
2
3
4
5
delete [] str;//<--освободили память
str = new char [
                        strlen(str)//Память уже освобождена и там может быть что угодно
                        +strlen(v.str+1)
                      ];
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
13.01.2014, 22:18  [ТС]     Конкатенация строк в объектах #3
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
5
delete [] str;//<--освободили память
str = new char [
                        strlen(str)//Память уже освобождена и там может быть что угодно
                        +strlen(v.str+1)
                      ];
Простите, но я вас не понял. Я полагаю, что освобождая память операцией delete [] str, я тем самым удаляю данные из памяти, на которые указывал str. В моем случае для того, чтобы "склеить" строки из объектов s1 и s2 в s1, нужно в первую очередь поместить в временное хранилище копию строки, на которую указывает указатель вызывающей функции, а уж затем подчищать память. Подправьте, пожалуйста, в моментах, в которых я ошибаюсь.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,910
Записей в блоге: 2
Завершенные тесты: 1
13.01.2014, 22:43     Конкатенация строк в объектах #4
Цитата Сообщение от Aндерсон_256 Посмотреть сообщение
я тем самым удаляю данные из памяти, на которые указывал str.
лишь указываете, что ранее выделенная память более не нужна.
C++
1
2
3
4
5
6
char * temp=new char[strlen(str)+strlen(v.str)+1)]; // создаем временный указатель
strcpy(temp,str);
strcat(temp,v.str);
delete [] str;
str=temp;
return *this;
Yandex
Объявления
13.01.2014, 22:43     Конкатенация строк в объектах
Ответ Создать тему
Опции темы

Текущее время: 16:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru