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

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

Восстановить пароль Регистрация
 
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
07.02.2012, 12:12     Почему программа вылетает при конкатенации строк? #1
Собственно код
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

как-то не догоняю с чего бы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.02.2012, 12:21     Почему программа вылетает при конкатенации строк? #2
Посмотри 79 строку. У меня вывело
Код
Привет, мир!
В чем конкретно проблема?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
07.02.2012, 12:23  [ТС]     Почему программа вылетает при конкатенации строк? #3
go, блин, спасибо)
C++
1
char* new_array = new char[new_size + 1];
надо было тут просто 1 прибавить)
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
07.02.2012, 12:29     Почему программа вылетает при конкатенации строк? #4
или в циклах size-1
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
07.02.2012, 12:30  [ТС]     Почему программа вылетает при конкатенации строк? #5
AzaKendler, тогда не все буквы скопируются
стандартно - слово + '\0' в конце
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
07.02.2012, 12:37     Почему программа вылетает при конкатенации строк? #6
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;
}
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
07.02.2012, 13:14  [ТС]     Почему программа вылетает при конкатенации строк? #7
AzaKendler, а разве не видно что у меня так?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 13:27     Почему программа вылетает при конкатенации строк?
Еще ссылки по теме:

Программа на С++ вылетает, не могу понять почему!? C++
Строка (почему вылетает программа?) C++
C++ Почему вылетает программа на delete []

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

Или воспользуйтесь поиском по форуму:
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
07.02.2012, 13:27     Почему программа вылетает при конкатенации строк? #8
да. все так. проблема была в том что писал за границу. ты прав
Yandex
Объявления
07.02.2012, 13:27     Почему программа вылетает при конкатенации строк?
Ответ Создать тему
Опции темы

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