c++的delete对象create with new,当需要返回时

C++ delete object create with new when needed for return

本文关键字:返回 new delete 对象 create with c++      更新时间:2023-10-16

当我需要返回结果时,我如何删除我用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;
}

或者这不是一个问题,因为它在超出作用域时被销毁。我能想到的唯一其他解决方案是将对象放在构造函数中并通过构造函数删除。我只是不想为一个函数添加一个变量。

在函数外部销毁动态创建的对象是完全可以的。

但是,在这种情况下,最好返回NULL

这里有一些很好的学习机会,所以我希望你不介意我偏离了你的问题。首先,你应该养成永远不要使用原始指针的习惯,即不要分配对象并将其保存在原始指针中。例如,原始指针是函数中类型为ClassObject *的变量sendback。我所说的"拥有"是指你有责任自己删除内存。

相反,如果需要动态分配对象,则应该始终将对象的所有权保存在智能指针中。例如,std::unique_ptrstd::shared_ptr优先于unique_ptr,除非您确实需要共享所有权。如果没有c++ 11兼容的编译器,可以使用Boost等效的boost::scoped_ptrboost::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()

在使用函数时还需要非常小心,因为函数的用户不能保证返回指针的对象不会被后续操作破坏——但这可能更多的是文档问题。

另一点需要说明的是,将函数的实参作为const string &而不是string来接受,以避免形参的临时拷贝(可能发生)。

如果你看一下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++语言的进一步发展,所以不要相信我的话,相信他的…:)。

干杯!

当您将对象赋值给函数外部的指针时,您可以从那里删除以避免内存泄漏。我理解你需要从函数对象指针,因此删除函数外似乎对我最有意义。使用后删除。如果它返回null,那么您不必删除任何内容。

我不明白为什么你创建一个对象,如果你返回对象。在我看来,这没有道理。调用者应该检查返回值,如果它为空,做一些事情,比如创建一个虚拟对象。你的方法被称为find,这告诉我它的合同是搜索一个项目并返回它或返回一个表示失败的值(nullptr)。如果您想在没有找到搜索对象的情况下创建一个对象,那么将其命名为first_or_default或类似的东西,因为这就是它的实际作用。