Rya*_*yan 1 c++ return delete-operator
当我需要返回结果时,如何删除我用new分配的空间.我使用了这个,所以如果我找不到一个对象,我会返回一个带有伪标记值的对象.
ClassObject* ClassObjectTwo::find(string findid) {
ClassObject *sendback;
bool found;
for(vector<ClassObject>::iterator it = data.begin(); it != data.end(); it++) {
if ( it->get_id() == findid) {
found = true;
sendback = &(*it);
}
}
if(!found) {
sendback = new ClassObject;
sendback->set_key(100);
}
return sendback;
}
Run Code Online (Sandbox Code Playgroud)
或者这不是一个问题,因为它超出范围时被销毁.我能想到的唯一其他解决方案是将对象放在构造函数中并通过构造函数进行删除.我只是不想为一个函数添加变量.
这里有一些很好的学习机会,所以我希望你不介意我偏离你的问题。首先,您应该养成永远不使用原始指针的习惯,即不要分配对象并将其保存在原始指针中。例如,原始指针是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());
Run Code Online (Sandbox Code Playgroud)
或者更好的是,使用 auto 来避免显式编写类型:
auto myObj = std::unique_ptr<ClassObject>(new ClassObject());
Run Code Online (Sandbox Code Playgroud)
使用 c++14 应该变成:
auto myObj = std::make_unique<ClassObject>();
Run Code Online (Sandbox Code Playgroud)
使用智能指针可以防止您遇到一些潜在的问题,并确保在遇到异常时删除这些对象。
然而,就您而言,您实际上根本不需要返回对象。如果您想指示没有找到对象,则返回NULL(或者实际上您应该使用 C++11 nullptr,如果您的编译器可用)。另一种选择是将迭代器返回到您找到的对象或data.end()找不到它的对象。
使用函数时还需要非常小心,因为函数的用户无法保证您返回的指针所指向的对象不会被某些后续操作破坏 - 但这可能更多是一个文档问题。
另一点可能是将函数的参数作为 a 而const string &不仅仅是 astring以避免参数的临时副本(这可能会发生)。
如果您查看 Herb Sutter 的博客,还会对与您的用例非常相似的问题进行更多讨论:
http://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/
以及关于此主题的一些进一步讨论:
Herb Sutter 写了许多关于 C++ 的优秀书籍,并且积极参与 C++ 语言的进一步开发,所以不要相信我的话,相信他的......:)。
干杯!