Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Как правильно выделить память под массив в функции. Пока делаю так, но это не правильно конечно. void InitArray(int *mas) { delete mas; mas= new int[10]; for (int i=0;i<10;i++) { mas =i; } }; void main() { int *MainMas; MainMas= new int; InitArray(MainMas); for (int i=0;i<10;i++) printf("%d",MainMas); delete MainMas; }; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2007, 17:45 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
YurmanКак правильно выделить память под массив в функции. Пока делаю так, но это не правильно конечно. void InitArray(int *mas) { delete mas; mas= new int[10]; for (int i=0;i<10;i++) { mas =i; } }; void main() { int *MainMas; MainMas= new int; InitArray(MainMas); for (int i=0;i<10;i++) printf("%d",MainMas); delete MainMas; }; Передавай по ссылке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2007, 17:51 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Напишите как пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2007, 21:01 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
YurmanНапишите как пожалуйста. Akh спать пошел, так что придется мне Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2007, 21:19 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Спасибо. Ради интереса, а в чем приемущество этого способа. Я думал просто указатель можно сунуть без инициализации и удаления. Или мой способ в корен неправильный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2007, 21:50 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
От блин, развели турусы на колёсах. Если нужно передавать одномерный массив, делайте просто так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Массивы в C/C++ передаются по ссылке, не по значению, это стандарт языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 00:39 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
blinded Код: plaintext 1. 2. Зачем??? достаточно просто delete[] mas, без if. Нулевые указатели можно удалять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 00:58 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
YurmanЯ думал просто указатель можно сунуть без инициализации и удаления. Или мой способ в корен неправильный? Можно, можно. В твоем случае, если хочешь использовать этот подход, договорись сам с собой, что в эту функцию будешь передавать ссылку на неинициализированный указатель, тогда просто в него записываешь указатель на выделенную память, ничего с ним предварительно не делая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 09:37 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
1) Память должа выделяться и освобождаться на одном и том же уровне. Оба действия в main. Оба действия в InitArray, DeleteArray соответственно. Выделение/освобождение на разных уровнях приведут к непонятному коду и ошибкам. Это не я придумал. 2) Память (как и любой другой ресурс, требующий освобождения) следует выделять в конструкторах и освобождать в деструкторах. Это позволит избежать ошибок и безопасно с точки зрения исключений. 3) Память вообще не надо выделять и освобождать руками. Пользуйся std::vector. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 09:50 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Дайте почитать где написано о нежелательности выделения памяти на разных уровнях. Может там напишут как лучше сделать такие функции как загрузка текстового файла, или загрузка векторного объекта например. Я ведь не могу до вызова функции знать сколько будет элементов. Получается надо будет вызвать функцию которая узнает сколько будет элементов. Потом в Main проинициализировать массив. А потом вызвать функцию которая загрузит этот массив. Может так оно и правильнее но проект уже и так большой и лишний раз перегружать его этим не хочется. Для примера приведу функцию которая есть в скриптовом языке одного векторного редактора. int mdlElement_stroke(DPoint3d** points,int* nPoints,MSElement* el,double tol); DPoint3d** points это массив точек векторного объекта int* nPoints колличество точек заранее я не знаю колличества точек а просто передаю points в эту функцию и она сама выделяет память и возрашает кол-во точек к сожалению ее исходников у меня нет вот и хотел спросить как это лучше реализовывается. в том что сделал я не нравится что указатель приходится инициализировать MainMas= new int а потом в функции удалять, но работает PS для mikhail_n иже с ними, я не передать массив хочу а память в функции выделить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 17:39 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
YurmanДля примера приведу функцию которая есть в скриптовом языке одного векторного редактора. int mdlElement_stroke(DPoint3d** points,int* nPoints,MSElement* el,double tol); DPoint3d** points это массив точек векторного объекта int* nPoints колличество точек заранее я не знаю колличества точек а просто передаю points в эту функцию и она сама выделяет память и возрашает кол-во точек к сожалению ее исходников у меня нет вот и хотел спросить как это лучше реализовывается. в том что сделал я не нравится что указатель приходится инициализировать MainMas= new int а потом в функции удалять, но работает PS для mikhail_n иже с ними, я не передать массив хочу а память в функции выделить Возьмите std::vector и вас не будет волновать ни выделение.освобождение памяти, да и предавать указатель на пременную- количество точек не придется И вести себя будет как массив int mdlElement_stroke(std::vector<DPoint3D>& points, MSElement& el,double tol); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 17:48 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Yurman в том что сделал я не нравится что указатель приходится инициализировать MainMas= new int а потом в функции удалять, но работает в твоем случае это не нужно. я тебе это уже написал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 18:29 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Хорошо, я еще почитаю в страуструпе, только конечно вс еперелопачивать придеться, а классы в качестве элементов можно использовать? И всетаки интересно как эта функция stroke получая в качестве аргумента указатель на указатель выделяет память без лишних движений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 20:19 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
YurmanХорошо, я еще почитаю в страуструпе, только конечно вс еперелопачивать придеться, а классы в качестве элементов можно использовать? Конечно, только не классы а объекты классов. Надо только помнить что стандартные контейнеры хранят объекты по значению, фактически если ты что-то кладешь в контейнер, то в нем хранится не то что ты положил, а его копия. Если нужно другое поведение или полиморфное поведение объектов придется хранить указатели, или еще луше ссмартпойнтеры Yurman И всетаки интересно как эта функция stroke получая в качестве аргумента указатель на указатель выделяет память без лишних движений. А чего там интересного... все тривиально. Сначала аллокируем массив некоторого размера, ну скажем 64 элемента, начинаем писать в него, если места нехватает, аллокируем массив в 2 раза больше переписываем из первоначального все во второй,ну и пока не считаем из файла все. Ежели охота вернуть лишнюю память системе - снова аллокируем массив точного размера и опять переписываем. Тупо и надежно. в С даже функция такая есть realloc называется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 20:43 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Понятно, тогда скажите какие минусы того как сделал я. Потому что возникло желание оставить все как есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 20:55 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Небольшое уточнение. Не всякие объекты можно хранить в std::vector. У них должны быть корректные конструкторы копирования, операторы присваивания, конструкторы и деструкторы. Более подробно смотри в литературе. На практике это означает, что все нормальные объекты можно хранить. Пример того, что нельзя: auto_ptr. Потому что после присваивания одному значение другого они не будут одинаковыми. int mdlElement_stroke -- функция, написанная на Си. В С++ так уже не модно. Что ты сделал неверно: 1) blinded в основном написал все по делу. Так что сначала исправь откровенные ошибки, тогда можно будет более предметно обсуждать. 2) InitArray -- я не нашел в документации описания этой функции, но судя по названию она должна инициализировать массив. Я не понял, почему она удаляет старое данные уже инициализированного массива. 3) void main() на самом деле int main(int, char**) 4) верни из main значение 5) Код: plaintext 1. 2. Код: plaintext 1. 6) Еще раз повторюсь, что есть правила хорошего тона, которые позволяют избегать (уменьшить вероятность) ошибок по невнимательности (забытые delete) и этими правилами стоит пользоваться. Вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 21:34 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Это я написал побыстренькому как примерчик. Название функции сам придумал оно ничего не значит. А delete mas; делаю потому что сделал MainMas= new int; в main, потому что если этого не сделать компилятор проходил а link выдавал ошибку. Тоесть int *MainMas; //MainMas= new int; InitArray(MainMas); Не работает, пишет что MainMas не инициализирован или чтото в этом роде, точно не помню. Ну а если сработает исключение в реальном проекте эт оозначает что дальнейшая работа программы не имеет смысла. Хотелось чтобы просто было так int *MainMas; InitArray(MainMas); а в функции без delete mas; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 22:15 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
YurmanНу а если сработает исключение в реальном проекте эт оозначает что дальнейшая работа программы не имеет смысла.Это не означает что надо падать. Надо сначала очистить память, потом записать в лог подобное описание где и почему произошла ошибка и только потом завершать программу. YurmanХотелось чтобы просто было так int *MainMas; InitArray(MainMas); а в функции без delete mas;Нельзя так делать. Если память выделена ее надо освободить. Обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 23:07 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Автор, внимательно прочитай замечания blinded Хотя бы потому, что не надо освобождать массив оператором delete. Надо использовать delete[]. И читай, что тебе пишет компилятор. Он тебе выдал не ошибку, а предупреждение. В общем, то, что написано в начале, содержит очень много ошибок. А больше предмета для разговора нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 11:17 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Ошибки в main если четсно меня не интересуют, я допустил их по невнимательности. а надо было разобраться как сделать так int *MainMas; //MainMas= new int тоесть без предварительной инициализации, просто сунуть в ф-цию указатель InitArray(MainMas); а в функции без delete mas; - это означает что в функции InitArray без delete [] mas В НАЧАЛЕ а потом конечно в main в конце вызвать delete [] mas. прям как в функции int mdlElement_stroke(DPoint3d** points,int* nPoints, - правда она на C Но ответа так и не получил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 12:19 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Сам-то понимаешь чего хочешь? Ну ладно на тебе так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. C++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 14:50 |
|
||
|
Выделение памяти в функции
|
|||
|---|---|---|---|
|
#18+
Наткнулся на запись Код: plaintext 1. и был весьма удивлён. Мне казалось, операции * и & компенсируют друг друга. Даже в голову бы не пришло, но очень выручило. Поясните, почему так? Вроде ведь указателя должно хватать, ну, как тут , например. Заодно, использовать векторы вместо массивов это разве не большой урон производительности? Я не шибко шарю, но насколько слышал, то за каждым элементом контейнеров STL стоит не просто значение, а ещё всякие премудрости типа указателей на следующий элемент и т.п. Из жизни: делал лабу — считать текстовый файлик, составить словарь и записать его в другой файл словарь. Пробовал словарь делать массивом char'ов и двусвязным списком. Первое записалось за секунду, второе за 1,5 минуты (и то и другое делал через файловые потоки и метод write() ). Это же жуть! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2013, 22:05 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=68&tid=2019819]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 176ms |

| 0 / 0 |
