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

Выделение динамической памяти C++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 01:33     Выделение динамической памяти C++ #1
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод, который выделяет память + 1 в зависимости от введённого размера пользователем, а т.е в классе метод для выделения, а в воде cin с вопросом введите длину строку. например он ввёл размерность 5, метод выделяет ещё + 1 (для \0) а потом вызывается метод ввода строки, если он введёт большее кол-во символов в строке, то вылет. как осуществить проверку? например он ввёл размерность 5, а ввёл 7 и ему выводилось на экран заново cin>> размерность и строка. Вот сам код. Help:

методы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String(int i)
    {
        string = new char[i + 1];
    }
    String(char * s)
    {
        strcpy(string, s);
    }
    ~String()
    {
        delete [] string;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
воид:

C++
1
2
3
4
5
6
7
8
9
10
11
else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:29     Выделение динамической памяти C++ #21
Я же прямым текстом сказал про код, предназначение которого я не понимаю. Повторю, я не понимаю, зачем выделять еще раз память для указателя, который и так уже указывает на строку, которая пришла от пользователя. Больше ничего не скажу, пусть кто-нибудь другой код пишет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:30  [ТС]     Выделение динамической памяти C++ #22
Vourhey, забей на ток код, будто его нет. я запутался уже... помоги пожалуйста
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:35     Выделение динамической памяти C++ #23
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
#include<iostream>
#include<cstring>
 
class String
{
private:
    char str[256];
 
public:
    String(const char *s)
    {
        strncpy(str, s, 256);
    }
 
    void Print()
    {
        std::cout<<str<<std::endl;
    }
};
 
int main()
{
    String object("test string");
    object.Print();
}
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:47  [ТС]     Выделение динамической памяти C++ #24
хах, я наверное до такой степени тупой, что ...

ошибка на этапе выполнения. вот код:

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
    char * ss[256];
public:
    String() // По умолчанию.
    {
        string = new char [81]; 
    }
    String(int i) // Позволяет создавать строку произвольного размера.
    {
        string = new char[i + 1];
    }
    String(const char * s) // Создание строки и инициализация.
    {
          strncpy(*ss, s, 256);
    }
    ~String()
    {
        delete [] string;
        delete [] ss;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"0 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        cout<<endl;
        if(choiseshowstring == 0) exit(0);
        if(choiseshowstring == 1) ShowString();
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Show()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<ss<<endl<<endl;
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
void main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
 
    String s;
 
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str("OwNeD");
                str.Show();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5664 / 3143 / 356
Регистрация: 29.11.2010
Сообщений: 8,418
27.11.2012, 03:48     Выделение динамической памяти C++ #25
C++
1
2
char ss[256];
strncpy(ss, s, 256);
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:51  [ТС]     Выделение динамической памяти C++ #26
ой, кое что не разглядел, сек..

Добавлено через 2 минуты
Конструктор отрабатывает, а потом ошибка.. вот текущий код:

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
    char ss[256];
public:
    String() // По умолчанию.
    {
        string = new char [81]; 
    }
    String(int i) // Позволяет создавать строку произвольного размера.
    {
        string = new char[i + 1];
    }
    String(const char * s)
    {
          strncpy(ss, s, 256);
    }
    ~String()
    {
        delete [] string;
        delete [] ss;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"0 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        cout<<endl;
        if(choiseshowstring == 0) exit(0);
        if(choiseshowstring == 1) ShowString();
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Show()
    {
        OemToAnsi(ss,ss);
        cout<<"Строка: "<<ss<<endl<<endl;
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
void main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
 
    String s;
 
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str("OwNeD");
                str.Show();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5664 / 3143 / 356
Регистрация: 29.11.2010
Сообщений: 8,418
27.11.2012, 03:53     Выделение динамической памяти C++ #27
C++
1
delete [] ss;
Это не нужно
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:53     Выделение динамической памяти C++ #28
C++
1
        delete [] ss;
Что это? Зачем это? Зачем тебе в классе буфер и указатель одновременно?
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:55  [ТС]     Выделение динамической памяти C++ #29
Vourhey,
MrGluck, а почему не нужно? нужно же очищать память, которую выделял

Добавлено через 49 секунд
убрал delete [] ss; и всё равно ошибка на этапе выполнения
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:56     Выделение динамической памяти C++ #30
Цитата Сообщение от owned Посмотреть сообщение
нужно же очищать память, которую выделял
А ты ее не выделял.

Добавлено через 29 секунд
owned, определись, с чем ты в классе работаешь, либо с указателем, либо с массивом, что ты все в кучу свалил...
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:56  [ТС]     Выделение динамической памяти C++ #31
Vourhey, таки да. ахах. а почему же и сейчас ошибка, когда убрал delete [] ss; ?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5664 / 3143 / 356
Регистрация: 29.11.2010
Сообщений: 8,418
27.11.2012, 03:57     Выделение динамической памяти C++ #32
delete очищает память, выделенную оператором new. ss само уничтожится вместе со своим объектом.
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:57  [ТС]     Выделение динамической памяти C++ #33
почему у меня сейчас ошибка? я не понимаю
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 04:01     Выделение динамической памяти C++ #34
Цитата Сообщение от owned Посмотреть сообщение
почему у меня сейчас ошибка?
Пффффф... Тебе бы с отладчиком познакомиться.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5664 / 3143 / 356
Регистрация: 29.11.2010
Сообщений: 8,418
27.11.2012, 04:02     Выделение динамической памяти C++ #35
Определитесь, с чем работаете. Я бы рекомендовал char[256], т.к. с выделением памяти вы явно плаваете.
Замените void main на int main, выложите ваш код и, если будут ошибки, то их текст.
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 04:08  [ТС]     Выделение динамической памяти C++ #36
? помогите пожалуйста, а то я сам не скоро въеду.. был случай, когда я случайно написал оператор присваивания вместо сравнения и потом разбирал пару часов(а сейчас времен нет), а тут ситуация похлеще.

Добавлено через 4 минуты
Скриншот - http://s54.***********/i146/1211/21/7040ad3a7bd7.png

Ошибка на этапе выполнения конструктора, выводится на экран текст (OwNeD), а потом "Прекращена работа программы", через дебагер прошёлся - Unhandled exception at 0x0F844F98 (msvcr110d.dll) in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0xCCCCCCC0.

Добавлено через 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
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
    char ss[256];
public:
    String() // По умолчанию.
    {
        string = new char [81]; 
    }
    String(int i) // Позволяет создавать строку произвольного размера.
    {
        string = new char[i + 1];
    }
    String(const char * s)
    {
          strncpy(ss, s, 256);
    }
    ~String()
    {
        delete [] string;
            }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"0 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        cout<<endl;
        if(choiseshowstring == 0) exit(0);
        if(choiseshowstring == 1) ShowString();
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Show()
    {
        OemToAnsi(ss,ss);
        cout<<"Строка: "<<ss<<endl<<endl;
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
int main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
 
    String s;
 
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str("OwNeD");
                str.Show();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 04:20     Выделение динамической памяти C++ #37
owned, честно, мне разбираться в твоем коде чуть лень, проще навскидку что-нибудь набросать:
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
#include<iostream>
#include<cstring>
 
class String
{
private:
    char *str;
 
public:
    String ()
    {
        str = NULL;
    }
 
    String(const char *s)
    { 
        str = new char[256];
        strncpy(str, s, 256);
    }
 
    void InputString(int size)
    {
        str = new char[size];
        std::cout<<"Input string: ";
        std::cin.getline(str, size);
    }
 
    void Print()
    {
        std::cout<<str<<std::endl;
    }
 
    ~String()
    {
        delete str;
    }
};
 
int main()
{
    int size = 0;
    String *object = new String("test string");
    object->Print();
    delete object;
    object = new String();
    std::cout<<"Input size: ";
    std::cin>>size;
    std::cin.get();
    object->InputString(size);
    object->Print();
    delete object;
}
Хватит мучить код. Возбми и перепиши заново. С самого начала. Пока один конструктор работать не заставишь, к другому не переходи.
Код выше навскидку написан. Будет утечка если вызвать подряд конструктор со строкой и inputstring. Но для примера, имхо, достаточно. Не тестил.

Добавлено через 6 минут
Тьфу, скобки забыл квадратные при удалении памяти для строки.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,910
Записей в блоге: 1
27.11.2012, 04:21     Выделение динамической памяти C++ #38
всё просто. у тебя только два из 3х конструкторов предназначены для работы с дин. выделением памяти.
Выбирая пункт 3, память не выделяется new. Это как бы нормально, не хочешь как хочешь,
но вот в конце обязательно вызовется деструктор, и попытается удалить string, которая даже не была выделена, ведь мы создали объект с помощью другого конструктора.
Затычка: добавить проверку на валидность указателя в деструкторе, обнулять указатель в конструкторе, если new не использовался.
C++
1
2
3
4
5
6
7
8
9
    String(const char * s)
    {
          string=NULL;
          strncpy(ss, s, 256);
    }
    ~String()
    {
        if (string) delete [] string;
            }
За
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5664 / 3143 / 356
Регистрация: 29.11.2010
Сообщений: 8,418
27.11.2012, 04:21     Выделение динамической памяти C++ #39
Мой совет: когда будешь осуществлять рефакторинг, бери char[256], динамические массивы оставь на потом, ты их не до конца пока осознаешь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 04:22     Выделение динамической памяти C++
Еще ссылки по теме:

C++ Выделение динамической памяти
C++ Освобождение и выделение динамической памяти
Выделение динамической памяти C++
Выделение и очистка динамической памяти C++
Выделение и использование динамической памяти C++

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

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 04:22     Выделение динамической памяти C++ #40
Цитата Сообщение от MrGluck Посмотреть сообщение
Мой совет: когда будешь осуществлять рефакторинг, бери char[256]

Не по теме:

плюсую оффтоплю, черт...

Yandex
Объявления
27.11.2012, 04:22     Выделение динамической памяти C++
Ответ Создать тему
Опции темы

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