Форум: "Потрепаться";
Текущий архив: 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