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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
#1

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

30.06.2014, 17:33. Просмотров 590. Ответов 13
Метки нет (Все метки)

Всем привет. Можете проконсультировать меня по некоторым вопросам связанные с выделением памяти под класс 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...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 17:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти под string (разъяснения) (C++):

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в пользовательский тип? Ведь мы заранее не можем...

Выделение памяти под строку - C++
Никак не могу понять, в чем проблема, подскажите пожалуйста. Предположим, инициализирую переменную, ожидая получить строку из 10...

Выделение памяти под структуру - C++
Доброго дня, товарисчи. В общем, возникла проблема при выделении памяти для структуры. Подскажите, пожалуйста, в чем ошибка. Собсна сам...

Выделение памяти под указатель - C++
Доброго времени суток. Возник такой вопрос: для любой программы, насколько мне известно, выделяется свой кусочек оперативной памяти. Когда...

Выделение памяти под массив - C++
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? //глобальная область int x_size = 3; ...

Выделение памяти под массив - C++
в массиве данных хранять в последовательных ячейках памяти В программе, выделенна память под массив, для ввода данных пользователем. ...

13
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
30.06.2014, 17:38 #2
а можно поинтересоваться что это и зачем? я не переварил информацию если честно
0
nmcf
5349 / 4669 / 1561
Регистрация: 14.04.2014
Сообщений: 18,595
30.06.2014, 17:41 #3
В первом случае нельзя переприсваивать raw не освободив связанную с ним память, тем более, тем, что возвратит substr() и trim().
Во втором нормально, если потом будет delete для возвращаемого указателя.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
30.06.2014, 17:42 #4
ну так лучше не делать... неудачное исключение и утечка памяти обеспечена
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
30.06.2014, 17:44 #5
Цитата Сообщение от nmcf Посмотреть сообщение
В первом случае нельзя переприсваивать raw не освободив связанную с ним память
Почему?
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
30.06.2014, 17:45 #6
LostCoast, зачем вообще динамически выделять память под string? Создаете проблемы на ровном месте.
0
nmcf
5349 / 4669 / 1561
Регистрация: 14.04.2014
Сообщений: 18,595
30.06.2014, 17:47 #7
Ну потому что утечка будет, единственный указатель уничтожается.
0
dzrkot
30.06.2014, 17:48
  #8

Не по теме:

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

0
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
30.06.2014, 17:50  [ТС] #9
0x10, частенько стал натыкаться на ошибку переполнения стека, вот и приходится выделять память динамически под большие значения. Я не так давно пишу на c++, в основном на c#.
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
30.06.2014, 17:52 #10
Цитата Сообщение от nmcf Посмотреть сообщение
Ну потому что утечка будет, единственный указатель уничтожается.
Не вижу там присвоения указателя.
Про динамическое выделение памяти под строку +1, почему не передавать ее по ссылке?
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
30.06.2014, 17:54 #11
LostCoast, посмотрите на sizeof(std::string) - он может быть не больше того же указателя. Проблемы с переполнением стека явно из-за другого.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
30.06.2014, 17:56 #12
Цитата Сообщение от LostCoast Посмотреть сообщение
0x10, частенько стал натыкаться на ошибку переполнения стека, вот и приходится выделять память динамически под большие значения. Я не так давно пишу на c++, в основном на c#.
так string итак её динамичеки выделяет
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
30.06.2014, 18:08 #13
Цитата Сообщение от LostCoast Посмотреть сообщение
частенько стал натыкаться на ошибку переполнения стека, вот и приходится выделять память динамически под большие значения.
Бывает при попытке создать большой массив примитивных типов на стеке, контейнеры стандартной плюсовой библиотеки память под данные отводят в куче динамически.
0
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
30.06.2014, 19:01  [ТС] #14
0x10, я использую cUrl, может быть где-то из-за него проблемы были, но когда перевел большие string, в string *, стало все работать. Поэтому подумал, что выделение памяти помогло
0
30.06.2014, 19:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 19:01
Привет! Вот еще темы с ответами:

Выделение памяти под переменную - C++
Драсте, уважаемые. Мне надо выделить переменную на 25мег, чтоб в ней хранить все просчёты выполненые программой. (Пробовал в BCB6 и в BCW...

Выделение памяти под матрицу - C++
Всем привет. float **AllocMat(int Rows, int Colomns) { float ** Mat; try { Mat = new...

Выделение памяти под массивы - C++
int **mas1 = new int*; for (int e = 0; e < q; e++) mas1 = new int; int **mas2 = new int*; for (int q = 0; q < e;...

Выделение памяти под указатель - C++
Здравствуйте форумчане,у меня возник маленький вопрос:) Почему sizeof(char) дает результат в 1 байт, а sizeof(char*) ) дает 4 байта.Как...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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