![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 19.01.2012
Сообщений: 12
|
![]()
Такая работа с выделением памяти безопасна или я всё таки теряю блоки? Если да, то есть ли способ кроме копирования всех элементов из старого массива в новый с добавлением нового числа? Конечно число это упрощённый пример нужно это все для класса. Получиться тогда жирная функция.
Код:
delete mass; от delete[] mass; Delete[2] mass; освободит память по этому адресу? |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 224
|
![]()
delete[] mass удалит весь массив mass
delete mass удалит начало массива (хотя я здесь могу ошибаться, желательно что бы кто-то более опытный уточнил).
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
|
![]() |
![]() |
![]() |
#3 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
delete это если был new object delete это для new object[n]; в вашем случае происходят потери mass= new int[accum]; тут, так как старую память вы не освобождаете. Цитата:
но нужно смотреть по стандарту плюсов. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Stilet; 24.01.2012 в 09:00. |
||
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 19.01.2012
Сообщений: 12
|
![]()
А как тогда создавать множество динамических объектов? Через список? Но он же медленный! Что, да как делать?
И почему компилятор не устраивает код вроде этого? Код:
Создаем массив указателей какого-то класса, и по очереди присваиваем свежий адрес каждой ячейке. Конечно теперь количество объектов ограничено размером массива указателей, но всё же размещаться и удаляться указатели в памяти будут быстрее чем целые объекты. Или кто-нибудь может предложить альтернативу получше? ![]() |
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
да и не медленный он. вообще берите std::vector или std::list. а в вашем случае нужно не терять старое значение указателя, копировать данные, а потом удалаять старые. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 24.01.2012 в 08:39. |
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]() Цитата:
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
![]() ничего оно не утратило смысл, как создавали, так же и удаляйте. иначе работа кода не гарантируется. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]() Цитата:
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
|
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
По стандарту UB. Все дело в том, что компиляторы обязаны различать метод создания блока (дин. массива), и метод создание отдельного объекта. Однако сам принцип выделения памяти, и запоминания количества элементов стандартном не регламентирован, и это на усмотрение компиляторов. Так например, многие компиляторы при выделении памяти под блок, выделяют чуть больше памяти. В начале выделенного блока записывают количество выделенных элементов. А указатель на блок возвращают со смещением (на нулевой элемент). Компиляторы не различают что это за указатель - начало массива, или отдельный объект. Поэтому, они не могут самостоятельно определить, что хочет программист: Код:
Поэтому, неизвестно точно, что произойдёт в этом случае: Код:
http://alenacpp.blogspot.com/2008/01/delete.html |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сортировка КУЧИ!!! | bignick | Общие вопросы по Java, Java SE, Kotlin | 6 | 11.04.2011 23:08 |
Правильное использование setw | Андрей Чернуха | Общие вопросы C/C++ | 0 | 04.01.2011 21:24 |
Повреждение кучи | fosder | Помощь студентам | 0 | 08.12.2010 01:36 |
Правильное использование IBTransaction | Sparky | БД в Delphi | 0 | 23.05.2010 18:40 |