![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
вот функция, преобразование int в char...
использую как printf("[%s][%s]",itos(4),itos(6)); Как в этом случае почистить память ? |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
в данном случае не как!!!
Добавлено @ 06:33 лутше делать так:
Это сообщение отредактировал(а) chaos - 28.7.2005, 06:41 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
тогда как правильно написать эту функцию ? |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
я бы сделал так:
Добавлено @ 06:48 или можно сделать объектную обертку для char* Это сообщение отредактировал(а) chaos - 28.7.2005, 06:46 |
|||
|
||||
| admsasha |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
неее, нужно что бы можно было использовать, так:printf("[%s][%s]",itos(4),itos(6)); так же удобнее чем вводить куча лишних переменных в главной процедуре Добавлено @ 07:00
извиняюсь, не то процитировал... спешил, когда писал..... |
||||
|
|||||
| Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Можно просто использовать std::string или MFC::CString и т.д.
В общем, когда выделяешь динамическую память, нужно всегда думать о том, кто и когда будет ее освобождать. Хорошо, когда у блока динамической памяти один владелец - тот, кто определяет время жизни. Твоя начальная функция плоха тем, что память выделяется внутри функции, а освобождать ее должен вызывающий код. Попробуй упомни. В общем случае используют умные указатели, но в твоем сойдет какой-нибудь строковый класс.
Для этого пример Chaos можно изменить так:
НО если тебе это нужно именно для печати, вообще забей и пользуйся стандартным форматированием:
-------------------- ... |
||||||
|
|||||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
вот еще одно решение:
PS класс не завершонный! Просто написан наспех что бы продемонстрировать конкретное решение и то решение на мой взгляд плохое, тк printf принимает ... после формата, так что еще надо делать явное преобразование (char *) Это сообщение отредактировал(а) chaos - 28.7.2005, 07:29 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
как всё непросто в этом C++... элементарная задача, создает большие проблемы.... |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
это ты сам себе создаешь проблемы тк можно вывести на экран printf("%d %d\n", 4,6); а ты извращаешься(а за извращения надо платить Это сообщение отредактировал(а) chaos - 28.7.2005, 08:03 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
я для примера показал, смысл так что из базы с varchar значением берется число, его нужно переделать, сложить с другим числом, и вывести, когда все это делается одной функцией без всяких дополнетельных переменных это очень удобно, еще и в одну строчку можно уместить printf ("%d \n",stoi(str1)+stoi(str2)); - примерно так |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
тогда извращение хранить в базе число в виде строки, хотя бы по тому что
sizeof(1000000) < sizeof("1000000") хотя дело тво1, на вкус и цвет... Это сообщение отредактировал(а) chaos - 28.7.2005, 08:14 |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
1. число 3-х значное... 2. может содержаться не только число... 3. мне так удобнее держать в varchar в том же perl и php никогда проблемы так такой простой задачей не возникало... обидно даже... что с C++ проблемы.. как я заметил он вообще плохо справляется с стринговым типом... даже функциии иначе чем для int приходится писать.... |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
Джефф Элджер C++ БИБЛИОТЕКА ПРОГРАММИСТА по сравнению с Perl, PHP PS хотя сам я не испытываю ни каких проблем, тк знаю перл и очень люблю его Это сообщение отредактировал(а) chaos - 28.7.2005, 08:26 |
|||
|
||||
| comcon1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Так-то так, однако уметь то, очем просил создатель темы тоже надо. Хотя это скорее "in a C-face", а не C++. Функции типа
как раз и занимаются внутри себя отведением памяти. Потом, если надо, ее можно почистить free(a). А если сделать printf("%s", strdup(b)) то память отведется, строка напечатается и память сотрется. Поскольку указатель на нее потеряется. Или я что-то неправильно понимаю? И ему такую же процедуру надо было написать.
Таких функций, которые возвращают указатель на отведенную внутри них память в системных вызовах очень много. Возьмите, к примеру, get_current_directory(). |
||||
|
|||||
| maxim1000 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
все тут правильно кроме "память сотрется " выделенную память надо стирать вручную или вызывать какую-то функцию, которая это сделает само ничего не освободится... еще как вариант можно делать такую функцию (только не надо это использовать, это ОЧЕНЬ плохой подход
в данном случае в начале создается достаточно большой буфер при каждом вызове в него записывается результат и возвращается указатель на него строки пишутся друг за другом после того, как дошли до конца, указатель сбрасывается на начало буфера таким образом самые первые строки стираются память выделяется один раз при старте программы (точнее, при первом вызове функции) и все а значит, никакой утечки не будет Добавлено @ 12:12
есть два класса таких функций: 1. возвращают указатель на какую-то область, которая была выделена когда-то и будет освобождена неизвестно когда, эта память используется исключительно для хранения конкретного результата 2. выделяют память и возвращают указатель на него - для них в help-никах обчыно пишут "вы сами должны освободить память от этого указателя" -------------------- qqq |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |