Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReallocMemory и New, конфликт? 
:(
    Опции темы
Woodoo
Дата 20.5.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



Нет ли каких либо ограничений на одновременное (в одной программе) использование new/delete и GetMemory/ReallocMemory/FreeMemory?

Дело в том, как только я применил ф-цию ReallocMemory к памяти, выделенной с помощью GetMemory, удаление с помощью delete независимого массива, существующего и созданого с помощью new char[256] стало приводить к исключению Access Violation.

Код приведу по необходимости... сложноват (как по мне)
PM MAIL   Вверх
JackYF
Дата 20.5.2008, 19:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(Woodoo @  20.5.2008,  18:24 Найти цитируемый пост)
Нет ли каких либо ограничений на одновременное (в одной программе) использование new/delete и GetMemory/ReallocMemory/FreeMemory?

Смешивать их нельзя ни в коем случае.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Woodoo
Дата 21.5.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



поподробнее можно?
есть урлы по теме?
PM MAIL   Вверх
LastAngel
Дата 21.5.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



с помощью delete можно удалять только память выделенную по new , также и malloc/free
PM MAIL   Вверх
Woodoo
Дата 21.5.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



Цитата(LastAngel @ 21.5.2008,  11:31)
с помощью delete можно удалять только память выделенную по new , также и malloc/free

Вы не поняли вопроса

Добавлено @ 11:40
иду дальше...
глюк обнаружился, но тема остаеться актуальной

P.S.: Кому интересно ошибка как всегда была глупейшая, не повторяйте!!! smile))
Код

char * a = new char[256];
a = "some text";
...
delete a; // exception!!!


Это сообщение отредактировал(а) Woodoo - 21.5.2008, 11:48
PM MAIL   Вверх
Rififi
Дата 21.5.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Цитата(Woodoo @  21.5.2008,  11:36 Найти цитируемый пост)
a = "some text";

вот против этого и придумывают всякие std:string'и и smart pointer'ы...

PM MAIL   Вверх
JackYF
Дата 21.5.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(Woodoo @  21.5.2008,  10:36 Найти цитируемый пост)
a = "some text";

Код

strcpy(a, "some text");


И лучше, и впраду, юзать std::string или другие классы строк.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Woodoo
Дата 21.5.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



 smile 

Давайте оставим предпочтения в покое. Я думаю каждый сам может решить что ему юзать.



Тема все еще открыта!

Может кто-нибудь внятно и толково объяснить ПОЧЕМУ нельзя использовать тему вместе? Может все же можно... как убрал косяк все заработало как часы...
PM MAIL   Вверх
Rififi
Дата 21.5.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



если в документации сказано что память выделенную GetMemory можно освобождать через delete - тогда можно. не сказано - значит нельзя. смекаешь?
PM MAIL   Вверх
Graf_h
Дата 21.5.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: нет
Всего: 5



Вообще лудше пользоватся new/delete!так как они не только выделяют/освобождают память, но также вызывают конструкторы/деструкторы, а также new - позволяет обработать исключение, когда по каким - то причинам нельзя выделить необходимый обьем памяти в куче! 

Это сообщение отредактировал(а) Graf_h - 21.5.2008, 15:20


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
LastAngel
Дата 21.5.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Цитата(Woodoo @ 21.5.2008,  11:36)
Вы не поняли вопроса

Их можно вместе юзать( какая разнца каким методом ты выделишь из кучи область памяти), нельзя выделять одним методом удалять другим ... 

Про исключения Graf_h прав

Это сообщение отредактировал(а) LastAngel - 21.5.2008, 15:23
PM MAIL   Вверх
Woodoo
Дата 21.5.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



я не являюсь новичком в программировании и не хотел бы чтобы форумчане тратили свои силы на объеснение того, что:  new вызывает конструктор/деконструктор, также генерирует исключение, освобжать память - только delete, для malloc - free, GetMemory - FreeMemory... последнии заместо исключения возвращают NULL при неудачи.

чтобы не возникло недорозумений. пример кода:
Код

//Create
   char *a = new char[100];
   char *b = (char *)GetMemory(100);
   ...

//Destroy
   FreeMemory(b);
   delete a;


lack of documentation on GetMemory/ReallocMemory/FreeMemory :(
PM MAIL   Вверх
LastAngel
Дата 21.5.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



delete [] a; надо

если не совсем забыл, то delete a; удалит указатель на область выделенной памяти при этом сама выделенная память будет висеть в куче без доступа к ней, а delete [] удалит всё нафих



Это сообщение отредактировал(а) LastAngel - 21.5.2008, 16:05
PM MAIL   Вверх
Woodoo
Дата 21.5.2008, 16:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



жжоте таварисч!

"a" у миня как бя вообще стековая переменная smile

в любом случае  smile 
PM MAIL   Вверх
Lazin
Дата 21.5.2008, 16:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



я в ауте, товарисчь Woodoo, вам руским языком на С++ написали
Цитата(Rififi @  21.5.2008,  11:59 Найти цитируемый пост)
a = "some text";

и как это побороть
Цитата(JackYF @  21.5.2008,  14:24 Найти цитируемый пост)
strcpy(a, "some text");

происходит здесь вот что:
Код

char * a = new char[256];//выделяется блок памяти, указатель а указывает на него
a = "some text";//ахтунг!!! указатель а - указывает на область памяти в стеке!!!
...
delete a; // exception!!! //точнее полный ахтунг! пытаемся удалить память в стеке, оператор delete понимает что что-то здесь нечисто и кидает исключение


как побороть уже написали, строку в а нужно скопировать через strcpy

malloc/free, new/delete - можно использовать в одной программе, но только для разных блоков памяти, то что создали через new должно быть удалено через delete, и аналогично для malloc/free

Добавлено через 55 секунд
Цитата(Woodoo @  21.5.2008,  15:49 Найти цитируемый пост)
delete a;

и да, нужно удалять через delete[], так как new[]...
PM MAIL Skype GTalk   Вверх
Alexeis
Дата 21.5.2008, 16:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Использовать new/delete, new[]/delete[], GetMemory/ReallocMemory/FreeMemory в одной программе можно, хотя бы потому что можно объединять С и С++ модули в одном проекте.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Woodoo
Дата 21.5.2008, 17:14 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



2Товарисч Lazin:
Читайте внимательней посты
Во втором же своем посту я косяк нашел, и просто напросто о нем сообщил.

Далее:
Код

char * a = new char[100];
delete a;


корректный код, который удалиь созданый ранее массив, так как "a" - указатель на него

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

2Alexeis:
Конструктивно. Respect.
Тема закрыта.
PM MAIL   Вверх
LastAngel
Дата 21.5.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Цитата(Woodoo @ 21.5.2008,  17:14)
Далее:
Код

char * a = new char[100];
delete a;


корректный код, который удалиь созданый ранее массив, так как "a" - указатель на него

с код гуардом прогони этот "правильный код" smile
PM MAIL   Вверх
Woodoo
Дата 22.5.2008, 10:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



2LastAngel:
Сразу прошу прощения за критику но: название темы читал? перед твоим пост читал? создаешь много офтопа. Тема  ЗАКРЫТА.
P.S.: развили демогогию... все тема должна была состоять из 2ух постов:

Woodoo: можно параллельно юзать new, GetMemory и malloc?
Alexeis: да

... это еще не начали доказывать, что new лучше чем malloc, и char * по сравнению с AnsiString отстой  smile , а ReallocMemory вообще пользоваться противопоказано

PM MAIL   Вверх
Lazin
Дата 22.5.2008, 11:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Цитата(Woodoo @ 21.5.2008,  17:14)
Далее:
Код

char * a = new char[100];
delete a;


корректный код, который удалиь созданый ранее массив, так как "a" - указатель на него

это некорректный код smile

Добавлено через 2 минуты и 6 секунд
некорректный он по 2-м причинам, одну назвали, вторая - этот код не безопасен и может привести к утечке памяти smile 
PM MAIL Skype GTalk   Вверх
JackYF
Дата 22.5.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(Woodoo @  21.5.2008,  16:14 Найти цитируемый пост)
который удалиь созданый ранее массив

По третьему разу: удаление с помощью "delete" памяти, выделенной с помощью "new[]" - ошибка. Что не ясно?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Rififi
Дата 22.5.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Цитата(Woodoo @  22.5.2008,  10:57 Найти цитируемый пост)
Woodoo: можно параллельно юзать new, GetMemory и malloc?
Alexeis: да


правильный вопрос звучит так:
можно ли совместно и независимо друг от друга юзать связки new/delete, new[]/delete[], GetMemory/FreeMemory и malloc/free?
PM MAIL   Вверх
Woodoo
Дата 22.5.2008, 13:09 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



Представте себе!!! Код преведенный мной РАБОТАЕТ КОРРЕКТНО. Скомпилируйте следующий код и откройте деспетчер задач
Код
int * p = new int[100000000];
ShowMessage("А теперь смотрим как освобождается память");
delete p;






Граждане, уважаемые! Будте благоразумны и адекватны!

Создайте новый топик и обсуждайте где там в память куда утекает! Автора темы данный вопрос не интересует! Интересующая информация давным давно получена!

Не стои более писать "По третьему разу:", "По четвертому разу:"


Т Е М А     З А К Р Ы Т А


PM MAIL   Вверх
Alexeis
Дата 22.5.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Woodoo, тем не менее правильно будет так
Код

int * p = new int[100000000];
ShowMessage("А теперь смотрим как освобождается память");
delete[] p;


Подобная ошибка иногда приводит к краху программы. Все зависит от компилятора, если компилятор шибко умный, то он может и сам сообразить, что вместо delete p; нужно подставить delete[] p; , но на самом деле удаление массива delete p; является недопустимым и приводит к непредсказуемым последствиям.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rififi
Дата 22.5.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Цитата(Woodoo @  22.5.2008,  13:09 Найти цитируемый пост)
Код преведенный мной РАБОТАЕТ КОРРЕКТНО.

Это пример так называемого неопределённого поведения.
Учи матчасть. раздел 18.4.1
PM MAIL   Вверх
Woodoo
Дата 22.5.2008, 13:35 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



админ, не дайте плиз еще сотни пользователям высказаться что правильно писать delete[], представте себе я это знаю!
ыыы... можно какнить удалить тему?
PM MAIL   Вверх
JackYF
Дата 22.5.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(Woodoo @  22.5.2008,  12:35 Найти цитируемый пост)
правильно писать delete[], представте себе я это знаю!

Ну хорошо, что знаешь. Правда, до этого в трёх своих постах ты почему-то говорил другое.

Цитата(Woodoo @  22.5.2008,  12:35 Найти цитируемый пост)
можно какнить удалить тему? 

Я считаю, что тема очень показательна. Так что пускай висит.

З.Ы. У нас здесь не балаган, поэтому будь добр выражаться технически грамотно, и, по возможности, с наименьшим количеством орфографических ошибок.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Woodoo
Дата 22.5.2008, 15:38 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



Я писал, что код работает корректно... то что это правильная запись я не писал.

"З.Ы. У нас здесь не балаган..." - ага, у нас тут сплошной оффтоп!

Советовал бы внимательней читать оставленные сообщения, перед тем как оставлять мнение
PM MAIL   Вверх
JackYF
Дата 22.5.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(Woodoo @  22.5.2008,  14:38 Найти цитируемый пост)
что код работает корректно

Корректно - значит по спецификации. А у тебя код работает ожидаемо по стечению обстоятельств (особенности реализации низкоуровневых функций new/new[]/delete/delete[], на которые полагаться нельзя). Кроме того, в случае не-POD типов данный код ведёт к утечкам памяти.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Woodoo
Дата 22.5.2008, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.6.2006
Где: Севастополь || Ял та

Репутация: нет
Всего: нет



JackYF, сколько можно!? Не будьте столь навязчевы! Нельзя же зарабатывать Ваше колличество сообщений таким образом! Будте конструктивны! Т.е. по делу... т.е. по теме... а тема... сами видите.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1229 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.