Я не знаю, что могу предложить лучшую практику , но вот моя точка зрения.
Проверка на NULL (неудачное размещение) является стандартной практикой в C и C ++, этохорошо понятная и легко узнаваемая идиома.Добавление дополнительного кода ошибки, в то же время обеспечивая гибкость, также добавляет, возможно, ненужную сложность.Вызывающим абонентам приходится решать, будут ли они использовать параметр.
Зачем им использовать параметр, если они не чувствуют, что он может выйти из строя в этом месте?Как бы
Если вы считаете, что код ошибки значительный.Я бы предложил альтернативную подпись, при которой вы всегда проверяете код возврата и не проверяете значение возвращаемого указателя:
// Returns error code.
static int createFoo(int, int, Foo **);
Это, возможно, менее удобная функция, но подталкивает вызывающего (пользователя)в правильном направлении.
В качестве альтернативы, вы можете использовать исключения, либо гарантируя, что выдается std :: bad_alloc, либо выбрасывая исключение вашего собственного создания с соответствующим кодом ошибки.Казалось бы, это самая чистая подпись:
struct fooException { int error; }
// Throws fooException if cannot create foo.
static foo * createFoo(int, int);
Философия, которой я руководствуюсь: минимизировать сложность.В этом случае, удалив то, что кажется посторонним вариантом.Либо код ошибки является значимым и должен использоваться всегда , либо он является посторонним и всегда будет игнорироваться.