|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.06.2012, 01:42 | #11 |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
То есть если у меня есть класс, в котором конструктор при создании добавляет к а единицу, мне надо использовать new.
А если мне надо выделить память под динамический массив int - malloc?
Спеши медленно.
|
05.06.2012, 01:50 | #12 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
Нет, new подходит для всех типов. malloc - функция из С, new - оператор из C++.
Да и new просто удобнее и читабельнее. Сравните: Код:
Форматируйте код, будьте людьми.
|
05.06.2012, 10:59 | #13 |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
я спокойно могу использовать new во всех случаях?
спасибо!
Спеши медленно.
|
05.06.2012, 12:23 | #14 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
в С++ да во всех.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
05.06.2012, 13:14 | #15 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
Удалять не забывай.
Форматируйте код, будьте людьми.
|
05.06.2012, 15:12 | #16 | |||||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Формулировка непонятна. Есть такие понятия, как "буфер" и "содержимое буфера". Будем называть строкой содержимое буфера.
Чтобы считать строку из файла нужно иметь выделенный буфер. Буфер можно выделить двумя способами: 1) Статическое выделение памяти: Код:
Код:
Цитата:
Пример считывание из файла в буфер, который выделен динамически: infile.txt Цитата:
Код:
К примеру, мы считываем данные из файла в буфер, чтобы обработать. Допустим, что количество данных в файле - нам неизвестно. Количество данных может быть - 3 однобайтовых числа. А может быть 5 миллиардом чисел (однобайтовых). Скажем, у нас оперативной памяти 4Г байт. Как быть? Есть два варианта решения: 1) с динамической памятью; 2) без динамической памяти. Нужно учесть, что буфер выделенный статически "раздувает" исполняемый (exe-файла) ровно на свой размер. А динамический буфер "не раздувает" exe-файл. Динамический буфер "раздувается" в оперативной памяти (exe-файл остаётся прежним). Вот как можно поступать с динамической памятью: 1) выделить небольшой кусочек (скажем 100 байт); 2) заполнить этот буфер; 3) если данные в файле остались, то нужно выделить ещё: Цитата:
И копировать всё содержимое старого буфера в новый. Ну конечно, ненужно забывать, что размер оперативной памяти конечен. Поэтому нужно задать ограничительное число. Если размер буфера станет больше этого числа, то нужно приступить к обработке данных. Обработать данные. Освободить буфер. Затем, снова выделить буфер размером 100 байт и т.д. А статический буфер конечен, поэтому после его заполнения нужно обработать данные. Затем опять заполнить буфер. Цитата:
Код:
Цитата:
Так делать нельзя. func может выделить внутри себя память и она же обязана её освободить. Либо main выделяет память и передаёт в func адрес начала буфера и его размер. И main освобождает буфер. Последний раз редактировалось 8Observer8; 05.06.2012 в 15:24. |
|||||
05.06.2012, 15:13 | #17 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
У меня по ходу дела возникло два вопроса:
1) Может ли func освободить буфер? Код:
Код:
|
05.06.2012, 16:03 | #18 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Цитата:
потому что страница в которую вы пишете еще не освобождена. но это есть повреждение кучи. далее там могут оказаться иные данные, которую будут испорчены. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|||
05.06.2012, 16:42 | #19 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Пепел Феникса, благодарю!
|
05.06.2012, 20:11 | #20 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Если ограничиться лишь рамками с++, то к твоим услугам три класса памяти: динамика, статика, стек.
Цитата:
Вот пример статического массива: Код:
Код:
Пример: Код:
Нет ни одной причины хранить в бинарнике все 20 обнуленных элементов. Достаточно сохранить лишь количество. Итак понятно, что все они при запуске должны быть заполнены нулями. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Распределение памяти. Динамическое выделение памяти с++ | Tolian92 | Помощь студентам | 8 | 14.05.2012 21:44 |
Выделение памяти (new) | ImmortalAlexSan | Общие вопросы C/C++ | 20 | 05.06.2011 23:39 |
Выделение памяти в С++ | Dj-IIyIIc | Общие вопросы C/C++ | 4 | 18.10.2010 14:39 |
выделение памяти | Артем1256 | Общие вопросы C/C++ | 1 | 13.11.2009 16:38 |
Выделение памяти | mutabor | Общие вопросы Delphi | 8 | 26.08.2009 18:16 |