Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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