Здесь есть отличная возможность узнать, поэтому я надеюсь, что вы не возражаете, чтобы я немного отклонился от вашего вопроса. Прежде всего, вы должны привыкнуть к тому, чтобы никогда не работать с владением исходными указателями, т. Е. Не выделять объект и удерживать его в необработанном указателе. Необработанным указателем является, например, переменная sendback
в вашей функции, которая имеет тип ClassObject *
. Под «владением» я имею в виду тот факт, что вы несете ответственность за удаление памяти самостоятельно.
Вместо этого вы должны всегда сохранять собственность объекта в интеллектуальном указателе, если он должен быть динамически распределен. То есть std::unique_ptr
или std::shared_ptr
с предпочтением unique_ptr
, если вам действительно не требуется совместное владение. Если у вас нет компилятора, совместимого с C++ 11, вы можете использовать эквиваленты Boost boost::scoped_ptr
и boost::shared_ptr
. Поэтому всякий раз, когда вы хотите динамически выделять объект, всегда помещайте его в интеллектуальный указатель - это гарантирует, что объект будет уничтожен, когда интеллектуальный указатель выходит за рамки. Теперь, если вы хотите вернуть динамически созданный объект, верните умный указатель, который удерживает объект. Как правило, если вам нужно написать delete
в своем коде, вы, вероятно, должны были бы использовать умный указатель.
Например, чтобы создать новый динамически созданный ClassObject, можно было бы написать:
std::unique_ptr<ClassObject> myObj = std::unique_ptr<ClassObject>(new ClassObject());
или даже лучше, использовать авто, чтобы избежать того, чтобы написать тип явно:
auto myObj = std::unique_ptr<ClassObject>(new ClassObject());
с с ++ 14, который должен стать:
Использование интеллектуального указателя предотвращает запуск у меня есть потенциальные проблемы с тем, чтобы эти объекты были удалены перед исключениями.
В вашем случае, однако, вам действительно не нужно возвращать объект вообще. Если вы хотите указать, что объекта не найдено, верните NULL
(или действительно вы должны использовать C++ 11 nullptr
, если он доступен с вашим компилятором). Другой вариант - вернуть итератор к найденному вами объекту или data.end()
, если вы не смогли его найти.
Вы также должны быть очень осторожны при использовании своей функции, так как пользователь функции не имеет гарантии, что объект, в который вы указали указатель, не будет уничтожен какой-либо последующей операцией - но это может быть больше проблемы с документацией.
Другим моментом может быть принятие аргумента функции как const string &
, а не только string
, чтобы избежать временной копии параметра (что может случиться).
Существует также еще некоторые дискуссии по вопросу удивительно похож на ваш случай использования, если вы посмотрите на блоге Герба Саттер:
http://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/
, а также некоторое дальнейшее обсуждение этого вопроса на:
http://herbsutter.com/2013/05/16/gotw-3-solution-using-the-standard-library-or-temporaries-revisited/
Herb Sutter написал ряд замечательных книг по C++ и принимает активное участие в дальнейшем развитии языка C++, так что не воспринимайте мой прист d для этого, возьмите его ... :).
Cheers!
Используйте оператор 'delete', чтобы избавиться от объектов, выделенных с помощью' new'. –
, если вы его не нашли, верните NULL. –
@Ryan Вообще говоря, если вы выделяете что-то с помощью 'new', оно не будет« выходить за рамки »и не будет автоматически освобождено для вас автоматически. Вы ** должны ** освободить его, используя 'delete'. (Педантизм: возможно, что некоторые классы закодированы так, чтобы позволить объекту автоматически «удалять» самостоятельно - или освобождаться без явного вызова 'delete', но для этого требуется дополнительный код программистом и обычно не рассматривается) , –