システムによって割り当てられたターゲットメモリgetaddrinfo()
を取得するために呼び出す関数があります。多くの人が知っているように、getaddrinfo() によって割り当てられたメモリを解放するsockaddr*
には、 を呼び出す必要があります。freeaddrinfo()
さて、私の関数には、いくつかの関数が失敗したために例外をスローする可能性のある場所がいくつかあります。私の最初の解決策は、freeaddrinfo()
すべての if ブロックに を組み込むことでした。しかし、関数が戻る前にとにかくそれを呼び出さなければならなかったので、それは私には見苦しく見えました。
しかし、私が遭遇した問題は、スローステートメントを __try ブロックにコーディングすることが許可されていないことです。
次に、msdn を読み、throw ステートメントを __try ブロック内から呼び出されるヘルパー関数にスワップしようとしました...そしてほら、コンパイラはもうそれをうめきませんでした...
何故ですか?そして、これは安全ですか?これは私には意味がありません:/
コード:
void function()
{
//...
addrinfo* pFinal;
__try
{
getaddrinfo(..., &pFinal);
//if(DoSomething1() == FAILED)
// throw(exception); //error C2712: Cannot use __try in functions that require object unwinding
//but this works
Helper();
//...
}
__finally
{
freeaddrinfo();
}
}
void Helper()
{
throw(Exception);
}
編集:
以下を試してみましたが、整数をスローしても機能しますが、クラスを例外として使用すると機能しません:
class X
{
public:
X(){};
~X(){};
};
void Helper()
{
throw(X());
}
void base()
{
__try
{
std::cout << "entering __try\n";
Helper();
std::cout << "leaving __try\n";
}
__finally
{
std::cout << "in __finally\n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try
{
base();
}
catch(int& X)
{
std::cout << "caught a X" << std::endl;
}
std::cin.get();
return 0;
}
なんで?:/