最近 C# と平行して、過去の資産を生かすために C++ でかれたコードを CLI でラップして C# から呼ぶことをよくやるんだけど、そのときの C++ のコードを見ていて危なっかしいなぁ〜と思う時を列挙しとく。
例外を投げるときにが例外クラス以外を投げる
整数を投げられると、受け取るほうが困ります><
困ったときは std::runtime_error を投げときゃいいんじゃないですか??
裸のポインタに動的メモリ確保してる
よくあるのがこんなの
例外とかで解放忘れたらこまるじゃん><
unsigned char* buffer = new unsigned char[64];
vector とか使っとこうよ
std::vector<unsigned char> buffer( 64 );
裸のハンドルにリソースを確保してる・Windows のみ
これも同じく、解放できなかったらどうすんのさ。
HANDLE hFile = ::CreateFile( ... ); ごにょごにょ ::CloseHandle( hFile );
shared_ptr で管理して>
HANDLE hFile = ::CreateFile( ... ); shared_ptr<void> handle = shared_ptr<void>( hFile, &::CloseHandle ) ごにょごにょ
戻り値がポインタ
呼び出し先か呼び出し元かとっちが解放すればいいかわからないので、リークの可能性があってドキドキがとまりません。。。
Windows API のリソースとか返された日にゃもうたまりません><
shared_ptr とか使いませう。
クラスを引数で渡すときに実体で渡してる
実体で渡すとコピーが発生する上に、ポインタを持った自作クラスなんぞ実体で渡されたら、もうドキドキがとまりません。。。
引数にするときは const の参照で渡してください><
void func( string str )
{
...
}
ではなく
void func( const string& str ) { ... }
で渡してください
const がない
constメンバ関数は重要 - Faith and Brave - C++で遊ぼう
ちょっと前に盛り上がってたけど、const は重要でしょ。
神経質なくらいに const にはこだわります。