Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключение в конструкторе вызывает повреждение, памяти - решение 
:(
    Опции темы
Royan
  Дата 6.7.2004, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Хотел было задать вопрос а потом до самого дошло ;) быть может кому-то это сбережет час времени

Нерпавильный код:

Код
 this->pMyFile = NULL;

 this->pMyFile = new CMyFile;//Выделяем память

 //Fire exception if failed to recieve memory
 if(/*Какое бы ни было условие*/){
   //Пытаясь пркратить конструирование объекта пытаемся выбросить исключение
   throw S_FALSE;//Вот здесь мы повредим память, о чем нам тут же сообщат
 }


Правильный код:

Код
 this->pMyFile = NULL;
 this->pMyFile = new CMyFile;//Выделяем память
 //Fire exception if failed to recieve memory
 if(/*Какое бы ни было условие*/){
   //Пытаясь прекратить конструирование объекта пытаемся выбросить исключение
   if(this->pMyFile !=NULL)
     delete this->pMyFile;//Сначала освободим память если она была выделена
   throw S_FALSE;//и только теперьвыбрасываем исключение
 }



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Олег М
Дата 7.7.2004, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пользуйся классами типа auto_ptr - таких проблем не будет.
Добавлено @ 14:51
http://msdn.microsoft.com/library/default....toptr_class.asp
PM MAIL ICQ   Вверх
Royan
Дата 7.7.2004, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



auto_ptr, это CRT, а CRT в виндах я пытаюсь изжить, так как там и так процедур хватает, чтобы решить практически любую повседневную задач


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Олег М
Дата 7.7.2004, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то ты не то говоришь, Royan. auto_ptr - это шаблон специально разработанный для работы с указателями, чтобы они автоматически удалялись, типа статичных объектов. Мне, лично, он тоже не очень нравится - я написал свой класс - потому что ахеренно нужно. И многие виновски хэндлы через него пользую.

Добавлено @ 15:00
А чем тебе ЦРТ не понравилось?
PM MAIL ICQ   Вверх
Royan
Дата 7.7.2004, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Цитата
А чем тебе ЦРТ не понравилось?


Все для своих целей в WinAPI следует пользоваться тем, что есть в Win32, а в консоле STL и подобные


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Олег М
Дата 7.7.2004, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Все для своих целей в WinAPI следует пользоваться тем, что есть в Win32, а в консоле STL и подобные

С ума сошёл?
STL - никаким местом не связана с консолями и винапи. Так же как остальные стандартные библиотеки.
Это всё !!!СТАНДАРТНЫЕ!!!! библиотеки С++, которые, за не которыми исключениями, будут работать ГДЕ-УГОДНО. И при разработки программ хорошим стилем считается пользоваться именно ими

Добавлено @ 15:21
Ты же пользуешься new и delete а это тоже из ЦРТ
PM MAIL ICQ   Вверх
AndyY
Дата 7.7.2004, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Олег М
ну, без нужды функции CRT лучше не пользовать. особенно вызывают сомнения функции типа setjump или beginthreadex... Уж лучше по простому - CreateThread, goto или return.

про STL - стандартная-то она стандартная, но приходится таскать за собой лишнюю dll на 400 килов, что элегантности проге не прибавляет (msvcp60.dll). И код с ее применением становится ужасно читаем.



--------------------
PM MAIL WWW   Вверх
Royan
Дата 7.7.2004, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Цитата
STL - никаким местом не связана с консолями и винапи.

А разве я говорил, что связана?

И то что мною здесь было написано относится исключительно к MS VC++. В STL сплошь и рядом юзаются new и delete => STL для MS VC++ напрямую завзязана с CRT. Тот факт, что их пользую я и говорю, что пытаюсь от этого уйти, тоже правда, а использование этих операторов не более чем пережиток внутри моих программ для Win32, также как и многие из нас не считая себя язычниками празднуют масленицу... baaa.gif


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Vyacheslav
Дата 8.7.2004, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Royan @ 7.7.2004, 17:51)
В STL сплошь и рядом юзаются new и delete => STL для MS VC++ напрямую завзязана с CRT. Тот факт, что их пользую я и говорю, что пытаюсь от этого уйти, тоже правда, а использование этих операторов не более чем пережиток внутри моих программ для Win32,

Класс !!!. В таком случае можно смело заявлять, что и весь С++ - пережиток.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Олег М
Дата 8.7.2004, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
сомнения функции типа setjump или beginthreadex

setjump - базара нет. Ей вообще лучше нигде не пользоваться.
А beginthreadex сделана специально для виндов. В ней до кучи инициализируется многопотоковое ЦРТ. Так что если используются стандартные библиотеки, то настоятельно рекомендуется пользоваться ей вместо CreateThread.

Цитата
В STL сплошь и рядом юзаются new и delete => STL для MS VC++ напрямую завзязана с CR

Во первых операторы new и delete можно переписать как тебе угодно и будут юзаться именно они.

Во вторых, дурью не майся, напиши свой класс типа auto_ptr, если он тебе не нравится (я так и сделал). Это тебе ОЧЕНЬ облегчит жизнь в ахеренных количествах ситуаций. Я бы тебе свой прислал - да под рукой сейчас нет, разве через недельку, если напомнишь.

Цитата
но приходится таскать за собой лишнюю dll на 400 килов, что элегантности проге не прибавляет (msvcp60.dll).

Что-то раньше не слишком-то эта ДЛЛка мешала (я об ней вообще не знал).

Цитата
И код с ее применением становится ужасно читаем.

Дык пиши так, чтобы он был не ужасно читаем. Что тебе мешает?
PM MAIL ICQ   Вверх
Vyacheslav
Дата 8.7.2004, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(AndyY @ 7.7.2004, 17:25)
про STL - стандартная-то она стандартная, но приходится таскать за собой лишнюю dll на 400 килов, что элегантности проге не прибавляет (msvcp60.dll). И код с ее применением становится ужасно читаем.

STL - не элегантна и плохо читаема? На мой вгляд - это одна из самых элегантых библиотек, придающая коду лаконичность и читабельность. И непонятно, зачем для STL потребовалась библиотека на 400 кило, по-скольку вся библиотека - шаблоны в хидерах. Хотя здесь утверждать не берусь. Я VC не дружу, а Билли еще и не так может


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Олег М
Дата 8.7.2004, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
На мой вгляд - это одна из самых элегантых библиотек, придающая коду лаконичность и читабельность.

Дай пять! adv/knuddel.gif
PM MAIL ICQ   Вверх
AndyY
Дата 8.7.2004, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav,
Олег М

smile.gif
мое мнение - что stl - это шутка, которую все восприняли всерьезsmile.gif)
ну о какой читаемости идет речь
Код

   list  < MyStruct>  thelist;
    thelist.push_back(obj);
    thelist.push_back(obj);
    thelist.push_back(obj);
    for(list< MyStruct>::iterator   i = thelist.begin(); i != thelist.end(); i++)
    {
           // можно обратиться к структуре так:
           (*i).A = 123;
...
    }

(пример из фака по STL от mr.DUDA).

Крайне сомнительная эленантность присутствует в выражении list< MyStruct>::iterator:).
А уж i++ - просто вредно, неокрепшие умы могут подумать что структуры лежат в памяти линейно.
Также неуклюжа конструкуия (*i).A - куда естественней i->

К примеру - как написал бы я:
Код

_list_t<MyStruct *> thelist;
thelist.add_tail( obj );
thelist.add_tail( obj );
thelist.add_tail( obj );

for( long lpos = thelist.head(); lpos; lpos = thelist.next( lpos ) )
{
  thelist.get( lpos )->a = 123;
}


что делать, когда требуется отдать итератор в другой модуль, который не имеет доступа к stl классам, а может быть вовсе написан на дельфи - также не ясно.
Добавлено @ 12:52
в общем, жду примеров использования библиотеки, которые делают код более читаемым, лаконичным и элегантным.


--------------------
PM MAIL WWW   Вверх
Олег М
Дата 8.7.2004, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
А уж i++ - просто вредно, неокрепшие умы могут подумать что структуры лежат в памяти линейно.

Неокрепшие умы вообще много чего могут подумать. И что писать библиотеки в расчёте на них. Списибо. Сталкивался.

Цитата
Также неуклюжа конструкуия (*i).A - куда естественней i->

Ну это к mr.Dude. Откуда я знаю - нафига он так написал?

Цитата
К примеру - как написал бы я:

Это пример хорошего или плохого стиля?

Цитата
что делать, когда требуется отдать итератор в другой модуль, который не имеет доступа к stl классам, а может быть вовсе написан на дельфи - также не ясно.

Не отдавать!

Согласен, в СТЛ есть кой-какие заморочки - но скорее всего я в них ещё просто не разобрался.

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


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



О том, как отвязаться от CRT и стоит ли это делать, можно почитать здесь


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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