1

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

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

4

4 回答 4

5

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

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

于 2013-05-24T21:15:47.103 回答
4

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

相反,如果需要动态分配对象,则应始终将对象的所有权保留在智能指针中。即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()如果您找不到它。

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

另一点可能是将函数的参数作为 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++ 语言的进一步发展,所以不要相信我的话,相信他的... :)。

干杯!

于 2013-05-24T21:59:08.990 回答
0

When you assign the object to a pointer outside the function, you can delete from there to avoid memory leak. I understand you need the object pointer from the function, and therefore deleting outside the function seems to make sense most to me. You delete after using it. if it returns null, then you don't have to delete anything.

于 2013-05-24T21:35:02.850 回答
0

如果您返回对象,我不明白为什么要创建对象。在我看来这没有意义。调用者应该检查返回值,如果它是 null 做一些事情,比如创建一个虚拟对象。你的方法被调用find,它告诉我它的合同是搜索一个项目并返回它或返回一个指示失败的值(nullptr)。如果您想创建一个对象以防找不到搜索的对象,请调用它first_or_default或类似的东西,因为它实际上是这样做的。

于 2013-05-24T22:12:31.017 回答