Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

Как портировать 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.059 c
14-1116184996
Ajax
2005-05-15 23:23
2005.06.06
Перегон авто из Европы


4-1113262099
jobo
2005-04-12 03:28
2005.06.06
Запрет Minimize конкретной формы


3-1114683770
mariya_mezenceva
2005-04-28 14:22
2005.06.06
проблема связи ado и dbase VI


10-1093590350
AntonSh
2004-08-27 11:05
2005.06.06
COM сервер


1-1116585966
Ustas
2005-05-20 14:46
2005.06.06
Прорисовка фона...