例外を使用していない場合は、コンストラクターを使用しないでください (または失敗する可能性のあるコンストラクターを記述しないでください)。代わりにファクトリ関数を使用し、それを使用して、失敗する可能性のあるビットを失敗する可能性のあるビットから切り離すことができます
class myClass {
private:
char *m_malloced_buffer;
// disallow calling ctors/dtors directly
myClass(char *malloced_buffer) : m_malloced_buffer(malloced_buffer) {}
~myClass() { free(m_malloced_buffer); }
public:
static myClass *create()
{
char *buf = static_cast<char*>(malloc(100*sizeof(*mem)));
if(!buf) return NULL;
void *myClassRes = malloc(sizeof(myClass));
if(!myClassRes) return NULL;
new (myClassRes) myClass(buf); // placement new, uses existing memory to invoke the ctor
return static_cast<myClass*>(myClassRes);
}
static void destroy(myClass* val)
{
if(!val) return;
val->~myClass(); // explicitly invoke dtor
free(val); // deallocate memory
}
};
...
myClass *val = myClass::create();
if(val) { ... }
myClass::destroy(val);
この例では、malloc と free を使用してすべての割り当てを行いましたが、new (std::nothrow) と delete を同じように簡単に使用できます。例外を使用せずにエラーをチェックできるように、ctor からファクトリ関数に失敗する可能性のあるすべての操作を抽出する必要があります。この単純な例でさえ、これが首の大きな痛みであることがわかります。コメントで「例外は適切なコーディング スタイルではない」ことを学んだとおっしゃいますが、それを学んだということですか (理由のある議論と説明を伴う指示によるか、経験からか)、または誰かが「例外は適切なコーディング スタイルではない」と言いました。あなたはその声明をドグマとして受け入れましたか?
bool で初期化されたメンバーを使用すると、ゾンビ オブジェクトの問題が発生します ( http://www.parashift.com/c++-faq-lite/exceptions.htmlを参照)。