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

Выделение памяти под string (разъяснения) - C++

Восстановить пароль Регистрация
 
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
30.06.2014, 17:33     Выделение памяти под string (разъяснения) #1
Всем привет. Можете проконсультировать меня по некоторым вопросам связанные с выделением памяти под класс string.
Вопрос 1.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
//cookie_name -> string
//cookies->data -> char *
 
string *raw = new string(cookies->data);
int start_index = -1;
 
if ((start_index = raw->find(cookie_name)) > 0) {
    int c_name_len = cookie_name.length();
    *raw = raw->substr(start_index, raw->length() - start_index);
    *raw = raw->substr(c_name_len, raw->length() - c_name_len);
    *raw = trim(*raw);
}
else {
    //TODO error
}
 
return raw;
Как в таком случае работает выделение памяти для raw? Есть ли тут какие либо утечки, и вообще грамотно ли написан код? Интересует момент с substr.


Вопрос 2.
C++
1
2
3
4
5
6
7
8
9
10
string * rsa_ecnrypt(string value) {
    ....
    unsigned char *result = new unsigned char[RSA_size(public_key)];
    if ((result_len = RSA_public_encrypt( ....
    ....
    string *result_str = new string(base64_encode(result, result_len));
    delete[] result;
 
    return result_str;
}
Есть ли тут утечка памяти и на сколько корректен код? Можно ли его оптимизировать, меня немного беспокоит выделение памяти под char, потом приходится создавать string...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 17:33     Выделение памяти под string (разъяснения)
Посмотрите здесь:

Выделение памяти под матрицу C++
выделение памяти под wchar_t C++
C++ Выделение памяти под структуры
Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) C++
C++ выделение памяти под структуру
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.06.2014, 17:38     Выделение памяти под string (разъяснения) #2
а можно поинтересоваться что это и зачем? я не переварил информацию если честно
nmcf
4269 / 3700 / 1245
Регистрация: 14.04.2014
Сообщений: 14,490
30.06.2014, 17:41     Выделение памяти под string (разъяснения) #3
В первом случае нельзя переприсваивать raw не освободив связанную с ним память, тем более, тем, что возвратит substr() и trim().
Во втором нормально, если потом будет delete для возвращаемого указателя.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.06.2014, 17:42     Выделение памяти под string (разъяснения) #4
ну так лучше не делать... неудачное исключение и утечка памяти обеспечена
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
30.06.2014, 17:44     Выделение памяти под string (разъяснения) #5
Цитата Сообщение от nmcf Посмотреть сообщение
В первом случае нельзя переприсваивать raw не освободив связанную с ним память
Почему?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.06.2014, 17:45     Выделение памяти под string (разъяснения) #6
LostCoast, зачем вообще динамически выделять память под string? Создаете проблемы на ровном месте.
nmcf
4269 / 3700 / 1245
Регистрация: 14.04.2014
Сообщений: 14,490
30.06.2014, 17:47     Выделение памяти под string (разъяснения) #7
Ну потому что утечка будет, единственный указатель уничтожается.
dzrkot
30.06.2014, 17:48
  #8

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
зачем вообще динамически выделять память под string? Создаете проблемы на ровном месте.
тоже не понимаю...мб в этом есть какая-то скрытая неизвестная цель)

LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
30.06.2014, 17:50  [ТС]     Выделение памяти под string (разъяснения) #9
0x10, частенько стал натыкаться на ошибку переполнения стека, вот и приходится выделять память динамически под большие значения. Я не так давно пишу на c++, в основном на c#.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
30.06.2014, 17:52     Выделение памяти под string (разъяснения) #10
Цитата Сообщение от nmcf Посмотреть сообщение
Ну потому что утечка будет, единственный указатель уничтожается.
Не вижу там присвоения указателя.
Про динамическое выделение памяти под строку +1, почему не передавать ее по ссылке?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.06.2014, 17:54     Выделение памяти под string (разъяснения) #11
LostCoast, посмотрите на sizeof(std::string) - он может быть не больше того же указателя. Проблемы с переполнением стека явно из-за другого.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.06.2014, 17:56     Выделение памяти под string (разъяснения) #12
Цитата Сообщение от LostCoast Посмотреть сообщение
0x10, частенько стал натыкаться на ошибку переполнения стека, вот и приходится выделять память динамически под большие значения. Я не так давно пишу на c++, в основном на c#.
так string итак её динамичеки выделяет
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
30.06.2014, 18:08     Выделение памяти под string (разъяснения) #13
Цитата Сообщение от LostCoast Посмотреть сообщение
частенько стал натыкаться на ошибку переполнения стека, вот и приходится выделять память динамически под большие значения.
Бывает при попытке создать большой массив примитивных типов на стеке, контейнеры стандартной плюсовой библиотеки память под данные отводят в куче динамически.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 19:01     Выделение памяти под string (разъяснения)
Еще ссылки по теме:

Выделение памяти под указатель C++
Выделение памяти под массивы C++
выделение памяти под структуру C++

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

Или воспользуйтесь поиском по форуму:
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
30.06.2014, 19:01  [ТС]     Выделение памяти под string (разъяснения) #14
0x10, я использую cUrl, может быть где-то из-за него проблемы были, но когда перевел большие string, в string *, стало все работать. Поэтому подумал, что выделение памяти помогло
Yandex
Объявления
30.06.2014, 19:01     Выделение памяти под string (разъяснения)
Ответ Создать тему
Опции темы

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