![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
tatan |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
Мне необходимо получить из функцию строку, которая в ней и формируется.
Как правильно сделать?
Еще пара вопросов: - правильно ли из функции передавать локальный указатель? - правильно ли я освободил память? Почитал по форуму, внятного ответа не увидел. |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
а вот для std::string operator= перегружет, так что в конечном счете будет выполняться копирование контента литерала ![]() Как делать - это дело вкуса и треболваний к производительности. Но в первом случае сделать memcpy() просто необходимо ![]() |
|||
|
||||
tatan |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
"будет выполняться копирование контента литерала" - что это значит?
Где необходимо сделать memcpy? |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
|
|||
|
||||
tatan |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
Понятно.
Функция будет получать строки сложным образом с диска ![]() |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
нет нет. |
|||
|
||||
tatan |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
to Fazil6
константная строка была взята для примера, внутри функции в любом случае будет работа с char *. Вопрос в том что правильно возвращать - локальный string или локальный char*. И в чем ключевая разница в этих подходах. И, если можно, подробней про неправильное освобождение памяти |
|||
|
||||
Dims |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Из функции передаётся значение переменной. В случае указателя -- это адрес. Сама переменная, в которой был указатель, уничтожается, а её содержимое копируется туда, откуда вызвана функция. Поскольку адрес занимает несколько байт, то это не накладно. Такие передачи не занимают машинного времени больше, чем просто вызов функции.
Ты освободил не ту память. Адрес той памяти, которую ты завёл оператором new ты забыл в тот момент, когда присвоил указателю адрес строки-константы. Добавлено через 2 минуты и 51 секунду Из функции МОЖНО передавать локальный указатель, если ты знаешь его происхождение. Например, если функция заводит внутри себя память и возвращает её адрес, то это допустимо. Главное -- не забыть её освободить. |
||||||||
|
|||||||||
tatan |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
to Dims
спасибо, начинаю понимать |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
да уж... Главное - это не делать так. главный фокус в том, на что этот указатель указывает. Откуда это взялось и кем и когда будет разрушено? Ненадо писать код функции так, что вызывающий код зависит от реализации внутри функции.
люди!!! Что здесь неоптимально? Человек в понятиях о элементарных вещах путается, а вы ему начинаете про производительность лепетать. Если уж говорить о данной конкретной строке, то стандартом оговорены такие ситуации и здесь будет простое создание объекта через копирующий конструктор. Это сообщение отредактировал(а) Fazil6 - 10.11.2007, 01:56 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |