Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014

Почему программа вылетает при конкатенации строк?

07.02.2012, 12:12. Показов 955. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef __STRING
#define __STRING
 
#include <ostream>
 
class String
{
public:
    String();
    String(const char*);
    String(const String&);
    
    ~String();
    
    const String& operator= (const String&);
    const String& operator+= (const String&);
    
    String operator+ (const String&) const;
    
    bool operator== (const String&) const;
    bool operator!= (const String&) const;
    
    unsigned int length() const;
    
    friend std::ostream& operator<< (std::ostream&, const String&);
    
protected:
    char* array;
    unsigned int size;            
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "string.h"
#include <cstring>
 
String::String() :
    array(), size()
{
}
 
String::String(const char* instance)
{
    size = strlen(instance);
    array = new char[size + 1];
    
    strcpy(array, instance);
}
 
String::String(const String& instance) :
    size(instance.size)
{
    array = new char[size + 1];
    strcpy(array, instance.array);
}
 
String::~String()
{
   if (array)
   {
       delete[]array;
       array = NULL;
   }
}
 
const String& String::operator= (const String& instance)
{
    if (this == &instance)
        return *this;
       
    if (array && size != instance.size)
        delete[]array;
 
    if (size != instance.size)
    {
        size = instance.size;
        array = new char[size + 1];
    }
    
    strcpy(array, instance.array);    
    
    return *this;
}
 
String String::operator+ (const String& instance) const
{
    String result;
    {
        String tmp_string(*this);
        tmp_string += instance;
 
        result = tmp_string;
    }
    return result;
}
 
const String& String::operator+= (const String& instance)
{
    unsigned int new_size = size + instance.size;
    char* new_array = new char[new_size];
    
    for (unsigned int i = 0; i < size; ++i)
        new_array[i] = array[i];
 
    delete[]array;
    array = NULL;
    array = new_array;
    new_array = NULL;
   
    for (unsigned int i = 0; i < instance.size; ++i)
        array[i + size] = instance.array[i];
    array[new_size] = NULL;
 
    size = new_size;
    return *this;
}
 
bool String::operator== (const String& instance) const
{
    return strcmp(array, instance.array) == 0;
}
 
bool String::operator!= (const String& instance) const
{
    return strcmp(array, instance.array);
}
 
unsigned int String::length() const
{
    return size;
}
 
std::ostream& operator<< (std::ostream& stream, const String& instance)
{
    return stream << instance.array;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdlib>
#include <iostream>
 
#include "string.h"
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    String str("Привет");
    std::cout << (str + String(", мир!")) << std::endl;
    
    system("PAUSE");   
    return EXIT_SUCCESS;
}
вылетает в 12 строке - это конкатенация строк
то есть в main.cpp в операторе operator +. Конкретнее - при удалении объекта tmp_string в 60 строке
в деструкторе почему то вылетает после delete[]array;

среда VS 2010 Express

как-то не догоняю с чего бы?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2012, 12:12
Ответы с готовыми решениями:

Почему вылетает программа при 32768, а при 20 все работает нормально?
Помогите исправить, почему программа вылетает при больших числах, а если поставить маленькие то все норм. то есть если 32768 заменить на...

Почему вылетает программа при нажатии Enter?
Здравствуйте! Помогите, кто разбирается хорошо в ВАТ-анике )) Работает моя программа нормально, но! Если тут :LOCK cls echo...

Обрезает нули при конкатенации строк
Всем привет! Такая проблема: Есть в таблице Paradox поле строковое размер 10 в него записан лицевой размером 7 символов например такой...

7
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
07.02.2012, 12:21
Посмотри 79 строку. У меня вывело
Code
1
Привет, мир!
В чем конкретно проблема?
1
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
07.02.2012, 12:23  [ТС]
go, блин, спасибо)
C++
1
char* new_array = new char[new_size + 1];
надо было тут просто 1 прибавить)
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
07.02.2012, 12:29
или в циклах size-1
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
07.02.2012, 12:30  [ТС]
AzaKendler, тогда не все буквы скопируются
стандартно - слово + '\0' в конце
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
07.02.2012, 12:37
sandye51, у тебя 2 массива. та строка что есть, кончается 0 и та которая прибаляется тоже кончается 0. при их слиянии что происходит?
по идее на выходе должна быть строка из двух и с 1м 0 в конце. у тебя так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const String& String::operator+= (const String& instance)
{
    unsigned int new_size = size + instance.size;
    char* new_array = new char[new_size];
    
        for (unsigned int i = 0; i < size; ++i)
                new_array[i] = array[i];
 
    delete[]array;
        array = NULL;
    array = new_array;
        new_array = NULL;
   
        for (unsigned int i = 0; i < instance.size; ++i)
                array[i + size] = instance.array[i];
        array[new_size] = NULL;
 
    size = new_size;
    return *this;
}
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
07.02.2012, 13:14  [ТС]
AzaKendler, а разве не видно что у меня так?)
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
07.02.2012, 13:27
да. все так. проблема была в том что писал за границу. ты прав
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2012, 13:27
Помогаю со студенческими работами здесь

Избежать конкатенации строк при запросе SQL
Знаю, что использовать конкатенацию строк при создании запроса SQL плохо. Но мне нужно создавать запрос, смотря активен ли чекбокс или нет....

Использовать два модуля. Программа конкатенации двух строк. Одна в главном модуле, другая во вспомогательном.
Прочитал много книжек но сроки поджимают в инсте ребята помогите пожалуйста, научился скадывать числа управлять регистрами но не как не...

Почему-то программа "вылетает" при вызове процедуры
Здравствуйте! написала программу, по поиску данных в текстовом файле. При вызове данной процедуры ничего не происходит (по идее, в исходном...

Почему программа вылетает
Здраствуйте, почему, когда пишу: unsigned char* p = new unsigned char; программа НЕ вылетает, а когда пишу: unsigned char p; ...

Почему вылетает программа?
Здрасте, почему вылетает программа на 999 индексе? int main() { int *arr; for (int i = 0; i &lt; 1000; ++i) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru