这里有一些很好的学习机会,所以我希望你不介意我偏离你的问题。首先,您应该养成从不使用原始指针的习惯,即不要分配对象并将其保存在原始指针中。例如,原始指针是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 来避免必须显式地编写类型:
auto myObj = std::unique_ptr<ClassObject>(new ClassObject());
使用 c++14 应该变成:
auto myObj = std::make_unique<ClassObject>();
使用智能指针可以防止您在确保这些对象在遇到异常时被删除时遇到一些潜在问题。
但是,在您的情况下,您根本不需要返回对象。如果您想表明没有找到对象,则返回(或者如果您的编译器可用,NULL
您应该使用 C++11 )。nullptr
另一种选择是将迭代器返回到您找到的对象,或者data.end()
如果您找不到它。
使用函数时还需要非常小心,因为函数的用户不能保证返回指针的对象不会被后续操作破坏 - 但这可能更多是文档问题.
另一点可能是将函数的参数作为 aconst string &
而不仅仅是 astring
以避免参数的临时副本(这可能会发生)。
如果您查看 Herb Sutter 的博客,还有更多关于与您的用例非常相似的问题的讨论:
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++ 语言的进一步发展,所以不要相信我的话,相信他的... :)。
干杯!