Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Вниз

Как портировать try..finally в C++ ?   Найти похожие ветки 

 
kull   (2005-05-17 18:12) [0]

Привет, народ!

Если я не ошибаюсь, то в ANSI С++ нет конструкции try..finally.

Как тогда из Object Pascal перевести такую конструкцию на C++?

try
 Some Statement...
finally
 Finally Statement...
end;


Кто-нибудь может мне помочь?


 
Ag.Smit ©   (2005-05-17 20:33) [1]

if IOResult <> 0 then
    begin
    end;

Если сказал фигню - необращайте внимания, я лишь начинаю.


 
Андрей Жук ©   (2005-05-17 20:36) [2]

int l = 0;
try
 {
 int i = 12/l;
 }
catch(...)
 {
 ShowMessage("1");
 }


 
Eraser ©   (2005-05-17 20:37) [3]

Ag.Smit ©
Если сказал фигню


Именно это и сказал. ))

kull
А в MSDN лень заглянуть? )
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfthetrycatchstatement.asp


public static void Main()
{
  int x;
  try
  {
     x = 123;   //   Don"t do that.
     // ...
  }
  catch
  {
     // ...
  }
  Console.Write(x);   // Error: Use of unassigned local variable "x".
}


 
Андрей Жук ©   (2005-05-17 20:37) [4]

а, про finally
есть
__finally


 
Bumba   (2005-05-17 20:39) [5]

Eсли Visual C++:

__try
{
...
}
__finally
{
...
}

(структурная обработка исключений)


 
DiamondShark ©   (2005-05-17 20:48) [6]


> Eraser ©   (17.05.05 20:37) [3]

С количеством плюсов не ошибся?


 
Eraser ©   (2005-05-17 20:53) [7]

DiamondShark ©

Упс.... я про C# написАл.


 
Eraser ©   (2005-05-17 20:57) [8]

DiamondShark ©

Хотя вот пример и на C++
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_The_try.2c_.catch.2c_.and_throw_S tatements.asp

короче я на M$C++ почти ничего не делал, так что ответственность с себя снимаю... это же всё таки форум по Delphi !!! )))))


 
wicked ©   (2005-05-17 21:28) [9]

у билдера тоже есть __finally, только нету тех дурацких ограничений на его использование, которые есть в VC (по крайней мере в 6-ой версии)...
так что спи спокойно, товарищ kull... :)


 
wicked ©   (2005-05-17 21:43) [10]

кстати, если хочется соответсвия стандартам - можно использовать конструкции вида
try {
// код
} catch(<раз>) {
// обработка исключения типа <раз>
} catch(...) {
// обработка всех других исключений
}
// то, что должно было идти в finally

единственное, что при этом return из-под try делать нельзя...

заодно выскажусь, что finally в языке типа си++ не сильно то и нужен, хотя он и удобен...


 
тихий вовочка ©   (2005-05-17 22:29) [11]

finally в языке типа си++ не сильно то и нужен, хотя он и удобен...

Вы сами поняли что сказали?
Вот ситуация:
вы выделили память под массив -
вы читаете туда из файла и что-то делаете еще -
вылетело исключение...
кто будет освобождать память и закрывать файл?


 
wicked ©   (2005-05-17 22:38) [12]


> Вы сами поняли что сказали?
> Вот ситуация:
> вы выделили память под массив -
> вы читаете туда из файла и что-то делаете еще -
> вылетело исключение...
> кто будет освобождать память и закрывать файл?

кто будет:
1) освобождать память - сам массив, я давно уже использую в его качестве vector<char> - жутко удобно... (спасибо человеку по имени Suntechnic за моральную поддержку.... ;))
и 2) закрывать файл - деструктор обьекта потока, который его и представляет... ежели это vcl"ный TFileStream, так он у меня в 100% случаев завернут в доморощенный smart pointer - тоже страх как удобно, я выражение delete <что-то> уже пару месяцев не писал...

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


 
kull   (2005-05-18 00:47) [13]

Все ето хорошо, но...
catch перехватывает exception, а try..finally - нет.

Вот например конструкция:

procedure Proc;
begin
 A := TMyClass.Create;
 try
   ...
   //  генерируется исключение которое, я могу обработать снаружи функции Proc.
   ...
 finally
   A.Free;
 end;
end;


Если мне не надо ловить exception, а просто ресурсы освободить?

Можно поподробнее про "доморощенный smart pointer"?


 
wicked ©   (2005-05-18 01:04) [14]

> kull   (18.05.05 00:47) [13]
а вот это как раз один из случаев, когда без finally будет трудно...


> Можно поподробнее про "доморощенный smart pointer"?

вот... если местный скрипт позабирает мои красивые отступы, то я не виноват... могу выслать мылом, там будет с отступами...
итак, просю любить и критиковать....
/*
(c) 2004 Andy Wilk
auto_pointer template class w/ reference counting, safe to use in STL containers
yep, it"s free, use it on your own
the only right I reserve is the authorship
*/

#ifndef _AUTO_POINTER_H
#define _AUTO_POINTER_H

//---------------------------------------------------------------------------
#include <stddef.h>

template <class Pt>
class cpp_release {
public:
cpp_release(){}
void operator()(void * pointer)
{
 Pt * p = (Pt *)pointer;
 delete p;
}
};

template <class Pt, class Releaser = cpp_release<Pt> >
class auto_pointer
{
private:
Pt * fData;
int * fRefCount;

void AddRef()
{
 if(fRefCount)
  (*fRefCount)++;
}
void DecRef()
{
 if(fRefCount){
  (*fRefCount)--;
  if((*fRefCount) < 1){
   Releaser r;
   r(fData);
   delete fRefCount;
   fRefCount = NULL;
   fData = NULL;
  }
 }
}

public:
auto_pointer(Pt * aData = NULL)
 : fData(aData), fRefCount(NULL)
{
 AttachData();
}
auto_pointer(const auto_pointer<Pt>& aData)
 : fData(aData.fData), fRefCount(aData.fRefCount)
{
 AddRef();
}
~auto_pointer()
{
 DecRef();
}

operator Pt*() const
{
 return fData;
}

auto_pointer<Pt>& operator=(Pt* aData)
{
 bool diff = fData != aData;
 if(diff){
  DecRef();
  fData = aData;
  AttachData();
 }
 return *this;
}
auto_pointer<Pt>& operator=(const auto_pointer<Pt>& aData)
{
 aData.AddRef();
 DecRef();
 fData = aData.fData;
 fRefCount = aData.fRefCount;
 return *this;
}

Pt* operator->() const
{
 return fData;
}
Pt& operator *() const
{
 return *fData;
}

bool operator !() const
{
 return fData == NULL;
}

void AttachData()
{
 if(fData)
  fRefCount = new int(1);
 else
  fRefCount = NULL;
}

void DetachData()
{
 if(fRefCount){
  if((*fRefCount) > 1)
   DecRef();
  else
   delete fRefCount;
 }
 fRefCount = NULL;
 fData = NULL;
}
};

#ifndef auto_vcl_class
#define auto_vcl_class auto_pointer
#endif

//---------------------------------------------------------------------------

#endif

почти платформенно независимый, с одним но - он неявно заточен для билдера, а именно, выделяет память по 4 байта, под счетчик ссылок... пример использования:
// загружаем в str текст из ресурса
void test(TStrings * str)
{
   auto_pointer<TResourceStream> res = new TResourceStream((int) MainInstance, "txt", RT_RCDATA);
   str->LoadFromStream(res);
}


 
Defunct ©   (2005-05-18 06:40) [15]

Programming in C is:
for(;P("\n").R-;P("|"))for(e=3DC;e-;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
and hunting for pointer BUGs for ever ...............


 
kull   (2005-05-18 11:05) [16]

Thanks!
Попробую поразбираться... :)


 
Igorek ©   (2005-05-18 23:47) [17]

rsdn.ru -> Статьи -> C/C++ -> C++ Arena -> "Симуляция блока try-finally для С++"


 
Fantasist.   (2005-05-19 00:38) [18]

>wicked ©   (18.05.05 01:04) [14]

boost::shared_ptr ?


 
wicked ©   (2005-05-19 01:46) [19]

> Fantasist.   (19.05.05 00:38) [18]
к стыду признаться - не глядел на них... с меня хватило std::auto_ptr...


 
wicked ©   (2005-05-19 01:55) [20]

> Fantasist.   (19.05.05 00:38) [18]
похоже на то, что я изобретал велосипед... но ничуть не жалею... ;)


 
Fantasist.   (2005-05-19 19:09) [21]

>wicked ©

:) Это хорошо! Boost сейчас набирает популярность довольно быстро,  но пока еще не настолько, чтобы о его возможностях знать наверняка. Нет пока никаких трудов популязирующих его и демонстрирующих его возможности (как например есть такое со стандартной библиотекой).



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.015 c
11-1098280221
Unknown Mystic
2004-10-20 17:50
2005.06.06
Компиляция.


1-1116916439
Pavelkq
2005-05-24 10:33
2005.06.06
Переброска массивов


6-1111329542
Radgar
2005-03-20 17:39
2005.06.06
Disconnect в ServerSocket


9-1110394276
Arkafon
2005-03-09 21:51
2005.06.06
GDI


1-1116519720
yarkeyev
2005-05-19 20:22
2005.06.06
Выпадающее меню....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский