![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Zerstroer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Здравствуйте!
Задумался над совершенно нубским вопросом. Есть структура вида:
Есть функция, куда экземпляр этой структуры передается по указателю:
Внутри функции для поля field память может быть выделена, а может быть и не выделена. Точно процесс проконтролировать невозможно. Но, во избежание утечки памяти после вызова MyFunction я вынужден освободить память с помощью free(). Я понимаю, что free должен выполняться как можно ближе к выделению памяти malloc(), но в данном случае реализовать это я не могу - malloc() возможно вызывается в MyFunction, а возможно нет. Я пробую решить эту задачу предварительной инициализацией MyStruct. Прошу подсказать наилучший способ решения этой ситуации. Я пробую делать
перед вызовом MyFunction. Насколько это верное решение? p.s. Прошу прощения, поторопился, и возможно разместил пост не в той ветке. Возможно, пост лучше переместить в "Общие вопросы" или "Вопросы для новичков". Это сообщение отредактировал(а) Zerstroer - 27.9.2015, 20:40 -------------------- In silico |
||||||
|
|||||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Так, кажется, я совсем замаялся.
Из головы вылетело, что можно инициализировать NULLом!
Не пойдет. Выяснил, что внутри функции возможен вызов такой вот строки: printf("%i %s\n", strlen(mystr->field), mysqr->field); Пока экспериментальным путем пришел к инициализации через malloc(0), но при вызове printf в функции - выводится ересь. Это сообщение отредактировал(а) Zerstroer - 27.9.2015, 21:31 -------------------- In silico |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Неверное. Если внутри функции будет выделена память, то ваш память от первоначального malloc будет потеряна, а нехорошо, даже если вызывалось malloc(0) Проинициализируйте поле каким нибудь валидным указателем, а после возврата из функции проверьте его - если он изменился, то функция перебила его malloc'ом, и значит нужно звать free PS. Тему перенес |
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
извините, недопонял Вас. Вы имеете ввиду присвоить указателю какое-либо значение? Что вы имеете ввиду под валидным указателем?
Вот это подойдет:
-------------------- In silico |
|||
|
||||
jsharp36 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.10.2011 Репутация: нет Всего: 1 |
не сиплюсплюсник, надеюсь кто поумнее поправит. А я дам древние советы.
1. Очень желательно память выделять и освобождать в одной и той же области. 2. Есть всякие умные указатели, лучше их использовать и не заботиться об освобождении. 3. Если 1 совет не получается, 2 не хочется, то всегда надо иницилизировать указатель, после освобождения обнулять. Просто как правило, чтобы нигде не допустить ошибку. Т.е.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
А Вы перед тем какfree на этот malloc(1) делаете? Иначе утечка памяти. Ну, например, можно так:
Всегда же можно проверить на NULL:
& - это по ссылке))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
SVN74 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
Может вам через конструктор?
В вашем случае наверно надо нечто подобное:
Это сообщение отредактировал(а) SVN74 - 1.10.2015, 12:03 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |