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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2013, 14:26   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию Выделение памяти для нужд C++ библиотеки

Здравствуйте.
Есть ли программиста уверенность в том, что все библиотечные функции используют new-delete, а не malloc/calloc-free? Другими словами - переопределение new-delete (глобальных) гарантирует полный контроль над выделением памяти, при использовании библиотеки С++?
220Volt вне форума Ответить с цитированием
Старый 12.01.2013, 15:03   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Нужно представлять себе, что такое оперативная память. Это "нечто", куда можно что-то записывать и откуда, "что-то считывать". malloс, выделяыет статический сегмент оперативной памяти, (посему сейчас и не в ходу у программйров). new, выделяет динамический участок, он может размещаться кусками, по всему объёму оперективки, это пре6дпочтительнее, чем malloс. Но есть и здессь подводные камни, для оптимизации работы, винда начинает перераспределять память, это выглядит как "подвисание" системы. В случае использования malloc/calloc, я такого не наблюдал.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.01.2013, 15:19   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Я думаю, что у всех выделений памяти ноги растут от winapi и не удивлюсь если new – это тот же malloc, но с вызовом конструктора. Зачем мне это нужно? Я хочу выделять память для процесса в участке виртуальной памяти, который потом буду проецировать в другом процессе, поэтому нужен полный контроль.
220Volt вне форума Ответить с цитированием
Старый 12.01.2013, 15:28   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Здравствуйте.
Есть ли программиста уверенность в том, что все библиотечные функции используют new-delete, а не malloc/calloc-free? Другими словами - переопределение new-delete (глобальных) гарантирует полный контроль над выделением памяти, при использовании библиотеки С++?
Что бы иметь такую уверенность, нужно изучить исходный код этой целевой библиотеки, и только после этого что либо утверждать.

Переопределение new/delete весьма опасная операция. Чреватая сюрпризами, которые могут сильно отравлять жизнь и приводить к перерасходу времени и денег на отладке и сопровождении. Что делает подобные трюки крайне нежелательными для продуктов, которые предполагается в последствии сопровождать.

Но если очень очень сильно хочется, то есть смысл глянуть в сторону реализации небезызвестного:

Код:
#ifdef _DEBUG
#include <crtdbg.h>                 //<--- изучите реализацию библиотеки
#define _CRTDBG_MAP_ALLOC
#endif
Вот здесь есть краткое популярное объяснение работы:

http://www.realcoding.net/articles/b...ati-c-crt.html


Имхо: стоит подумать семь раз, прежде чем решиться на перехват crt функций работы с памятью.
_Bers вне форума Ответить с цитированием
Старый 12.01.2013, 15:32   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Вы удивитесь ещё больше, если вспомните, что язык С, появился тогда, когда память была собрана на ферритовых кольцах. Про динамическое , её выделение, никто даже думать не смел. Ещё раз говорю - вделение malloc сейчас, конечно, можно использовать, но профессиональные программёры, будут долго плеваться в Вашу сторону.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.01.2013, 16:20   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Вы удивитесь ещё больше, если вспомните, что язык С, появился тогда, когда память была собрана на ферритовых кольцах. Про динамическое , её выделение, никто даже думать не смел. Ещё раз говорю - вделение malloc сейчас, конечно, можно использовать, но профессиональные программёры, будут долго плеваться в Вашу сторону.
Я не хочу использовать malloc, реализацию надо на winapi.

_Bers, спасибо за ссылку натолкнуло на интересные мысли.
P.S. благодарю за ответы, думаю разобрался.

Последний раз редактировалось 220Volt; 12.01.2013 в 16:22.
220Volt вне форума Ответить с цитированием
Старый 12.01.2013, 16:31   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
думаю разобрался.
Удачи. Но, старайтесь не использовать malloc, у нас, на с чёт него, были большие споры (вплоть до драк), когда одна прога "захватывала" всю память, тогда, как другая "висела" в ожидании высвобождения ресурса. С появлением в с++ конструкции new, все проблемы решились сами-собой. Ненавижу malloc. Хотя у неё есть и достоинстува. Если в Асме, нужно что-то поправить при выделенной статически памяти, достаточно знать начальный адрес. При динамическом выделении, нужно знать ищё и указатель.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 12.01.2013 в 16:38.
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.01.2013, 16:38   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Удачи. Но, старайтесь не использовать malloc, у нас, на с чёт него, были большие споры (вплоть до драк), когда одна прога "захватывала" всю бамять, тогда, как другая "висела" в ожидании высвобождения ресурса. С появлением в с++ конструкции new, все проблемы решились сами-собой. Ненавижу malloc.
интересно мне знать какая статическая память в винде?
у каждого процесса свое адресное пространство в 2ГБ минимум.
и чтоб в него влезть надо через VirtualAllocEx там тогда, причем в каждый процесс.

далее насчет динамической памяти, перемещать память нельзя вообще то(указатели то помрут тогда), или вы о чем? о страницах физ памяти может?

далее:
Код:
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }
забавно правда?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.01.2013 в 16:41.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.01.2013, 16:44   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
С появлением в с++ конструкции new, все проблемы решились сами-собой. Ненавижу malloc.
Для объектов - да.
А для POD вполне себе нормально malloc.
_expand
_msize
realloc
Аналогов вроде в c++ нет.
PS

Цитата:
new, выделяет динамический участок, он может размещаться кусками
Не встречал объекта имеющего прерывистый диапазон адресов.
EUGY вне форума Ответить с цитированием
Старый 12.01.2013, 16:51   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
malloс, выделяыет статический сегмент оперативной памяти, (посему сейчас и не в ходу у программйров). new, выделяет динамический участок, он может размещаться кусками, по всему объёму оперективки, это пре6дпочтительнее, чем malloс.
чтот я не пойму о чем ты говоришь. единственная разница между malloc и new только в том, что new вызывает конструктор (ну и исключение кидает). память они получают одинаково, через один и тот же системный вызов.

Цитата:
new, выделяет динамический участок, он может размещаться кусками
кусками где? в физической памяти? естественно кусками, malloc точно так же выделит память кусками. в виртуальной никаких кусков нет, и new и malloc выделят непрерывный кусок памяти.

в общем я не вкурил, что ты имеешь в виду. ссылки чтоль какие приведи.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 12.01.2013 в 16:56.
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка оболочки для UPX для своих нужд Ёжик в тумане Общие вопросы Delphi 9 08.08.2012 12:04
Ограничение/выделение памяти для приложений(программ) gekap404 Win Api 1 13.03.2012 14:30
Выделение памяти для строк virtuhay266 Общие вопросы C/C++ 4 05.12.2011 23:52
Выделение диапазона адресов для окна памяти платы ISA Veri Общие вопросы C/C++ 1 27.09.2011 14:20
Выделение памяти в функции для переданных параметров LinuxUser Общие вопросы C/C++ 1 12.11.2007 19:21