c++的delete对象create with new,当需要返回时
C++ delete object create with new when needed for return
当我需要返回结果时,我如何删除我用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_ptr
或std::shared_ptr
优先于unique_ptr
,除非您确实需要共享所有权。如果没有c++ 11兼容的编译器,可以使用Boost等效的boost::scoped_ptr
和boost::shared_ptr
。因此,无论何时你想动态分配一个对象,总是把它放在智能指针中——这将确保当智能指针超出作用域时对象被销毁。现在,如果你想返回一个动态创建的对象,返回一个保存该对象的智能指针。根据经验,如果您需要在代码中编写delete
,您可能应该使用智能指针。
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
或类似的东西,因为这就是它的实际作用。
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 我可以从取消引用"new"的返回值初始化引用吗
- 将指针返回使用New创建的数组数组
- 基于索引的 alloca 返回的指针访问和"placement new"的效果
- 函数是否应返回"new"对象
- 放置 new 的返回值与其操作数的强制转换值之间是否存在(语义)差异
- 需要帮助按 "enter or new line" 以允许用户返回主菜单
- 构造函数中的 Malloc 在通过 New 调用时返回 NULL
- 重载不同返回值的运算符new
- 返回使用 new 创建的对象
- c++:new返回一个类型,但编译正常
- C++本地对象超出范围,返回指针(使用new分配的内存).因此内存泄漏
- C++:返回多个NEW数组
- 具有空异常规范的运算符new在分配返回0时调用构造函数
- 当退出 new/malloc 函数时,从 new/malloc 返回的指针如何保持在范围内
- 运算符 new[] 的返回地址与数组的实际地址之间的差异
- 从函数返回指向对象的指针,而不使用 new 分配指针
- 做 malloc 和 new 返回一个 int 对齐的地址
- 通过类中的重载运算符 new 返回不同的类指针
- 返回空指针的用户定义运算符new