Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2012, 17:54   #21
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от rlib Посмотреть сообщение
В любой ADT (Abstract Data Type) на C, функция create()_ создает динамический обьект и возвращает хендл user-у, котрый САМ обязан освободить этот обьект. Наверно, самым лучшим примером будет весь WinAPI.
Если говорить о си, то да - действительно, Юзер сам дергает создавалку объекта, и сам же дергает убивалку объекта. Причем "Юзером" в этом случае является вызывающая сторона.

Но(!) Вызывающая сторона сама явно создаёт объект (при помощи создавалки), и сама же его явно убивает (при помощи убивалки).

Все довольно четко и логично. Никакой путаницы нет.
При этом, выполняется правило: "одна функция - одна задача".
Создавалка не занимается ничем, кроме создания объекта.

Она не делает никаких предположений о том, что потом с этим объектом будет делать вызывающая сторона.

Ты же запихиваешь в создавалку ещё и инициализацию объекта данными, то бишь операцию присваивания ему значений. И при этом прибиваешь эту операцию гвоздями к динамической памяти.

И вот здесь слабое звено твоей конструкции:
Что бы получить строку твоим инструментом, потребуется априори пользоваться кучей. Потому что твоя создавалка делает сразу два ничем не связанных дела - дёргает кучу, и выполняет присвоение. Два дела в одной функции.

Но на языке си нет ни одной причины так себя ограничивать. А если я не хочу создавать объект в дин. памяти, а потом пасти его корректное удаление?

У меня маленькие строки, буфера на стеке хватит за глаза.
Я просто хочу передать указатель на этот стековый буфер в функцию, которая загрузит в него данные.

Когда строка станет мне не нужной - мне даже удалять её явно не придётся. Такой вот он стек.

На языке си нет разницы между указателями на стековые данные, и на динамические. Так почему это я должен вот так себя обламывать, и обязательно пользоваться только кучей? И постоянно пасти утечки памяти?

Вот ты говоришь: обязан пользовать дин. память. А я говорю: ты не прав. Это лишнее и совершенно не нужное ограничение. Просто нужно функции проектировать так, что бы каждая решала только свою задачу, и не мешать все в кучу.
_Bers вне форума Ответить с цитированием
Старый 27.05.2012, 20:00   #22
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Ты же запихиваешь в создавалку ещё и инициализацию объекта данными, то бишь операцию присваивания ему значений. И при этом прибиваешь эту операцию гвоздями к динамической памяти.
Ну, это ж пример был просто!
Для нормальной работы со строками можно АДТ в Ц создать, генерик.
rlib вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возврат массива из функции max_prorok Помощь студентам 2 06.10.2011 12:39
Возврат 2 и более аргументов из функции. Drilla Microsoft Office Excel 2 18.09.2011 14:11
c++ возврат указателя из функции Neolit1819 Помощь студентам 6 28.03.2011 15:37
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Возврат результата функции по ссылке gladov Общие вопросы C/C++ 2 24.06.2008 22:48