- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑我最近在我们的代码库中看到的以下示例代码:
void ClassA::ExportAnimation(auto_ptr<CAnimation> animation)
{
... does something
}
// calling method:
void classB::someMethod()
{
auto_ptr<CAnimation> animation (new CAnimation(1,2));
ClassA classAInstance;
classAInstance.ExportAnimation(animation)
... do some more stuff
}
我不喜欢这样——我宁愿这样写:
void ClassA::ExportAnimation(CAnimation* animation)
{
... does something
}
// calling method:
void classB::someMethod()
{
auto_ptr<CAnimation> animation (new CAnimation(1,2));
ClassA classAInstance;
classAInstance.ExportAnimation(animation.get())
... do some more stuff
}
但这真的是个问题吗?
最佳答案
这完全取决于什么ExportAnimation
是以及它是如何实现的。
它是否只在调用期间使用对象然后离开它?
然后转换为引用,传递一个真正的引用。不需要传递成员资格并且参数不是可选的,所以 void ExportAnimation( CAnimation const & )
足够了。优点是从界面上可以清楚地看出该方法没有内存管理问题,它只会使用传递的对象并保持原样。在这种情况下,传递原始指针(如在您建议的代码中)比传递引用要糟糕得多,因为不清楚 ExportAnimation
是否存在。是否负责删除传入的对象。
它是否保留该对象供以后使用?
如果函数启动线程以在后台导出动画,则可能是这种情况。在这种情况下,必须明确参数的生命周期必须超过调用的持续时间。这可以通过使用 shared_ptr
来解决。 -- 在函数内和函数外 -- 因为它们传达了对象是共享的并且将尽可能多地保持事件的意思。或者您实际上可以转让所有权。
在后一种情况下,如果执行所有权转移,那么初始代码就可以了——签名在所有权转移中是明确的。否则您可以选择记录行为,更改为原始指针并通过调用 ExportAnimation( myAnimation.release() )
显式传输.
您已将一些问题添加为对另一个答案的评论:
can I really see that object no longer exists after the method call?
来电者auto_ptr
在调用中重置为 0,因此任何取消引用都将导致错误并在您尝试的第一个测试中被标记。
I would need to look at the header file to see that the parameter type is an auto_ptr and not a normal pointer.
您不需要查看 header ...只需尝试传递一个原始指针,编译器会告诉您它需要一个 auto_ptr<>
。 --没有从原始指针到auto_ptr
的隐式转换.
I would expect the object to exist until the auto_ptr goes out of scope.
标准auto_ptr
,不像boost::scope_ptr
,没有那种语义。对象的所有权可以释放或传递给其他人auto_ptr
,因此假设一个对象保存在 auto_ptr
中生活在auto_ptr
的整个范围内本身就不好。
关于c++ - 代码审查问题——我应该允许将 auto_ptr 作为参数传递吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3439730/
我正在开发一个名为 Quiz 的系统... 最后剩下的就是“线索”。目前我有 我想从 xml 中删除线索,因为很难
一旦拉取请求被批准,如果还有进一步的提交: 拉取请求应该转到 未获批准 自动状态。 这能做到吗? 最佳答案 能力推送新提交时取消过时的拉取请求批准 是 下的设置合并前需要拉取请求审查 在 branch
我想发送我的App进行外部Beta测试,所以我想为此使用Apple的新TestFlight系统。 我设法邀请了内部测试人员,他们可以测试该应用程序,因此我发现我必须将该应用程序提交给外部Beta测试。
对于以某种方式使这个 if 条件更短(更优雅),你有什么建议吗? if (@path.start_with? "scp" || @path.start_with? "http") @source
我管理一个在线目录。目前,内部人员手动更新,他们的更改立即可见。现在我们要添加一个验证步骤:Tom 进行更改,Jerry 批准。 我看到两条路,但都不优雅。 保留整个数据库的第二个“工作副本”。 在同
我的程序应该采用任意数量的单字文本字符串参数,每个参数的长度小于 128 个字符。它将所有文本从 stdin 复制到 stdout,但输入中看到的任何单词都会被单词 CENSORED 替换。到目前为止
我有一个团队在几个 GitHub 存储库中工作。每个存储库都有负责人(维护者)对拉取请求进行最终审查,如果可以则将其合并到 master 中。所有其他成员都是此存储库的开发人员和审阅者(但可能在另一个
是否有任何官方/有效的方式来发送对 Android 开发者指南的反馈?我注意到一个错误(一个页面建议使用文档中列为已弃用的方法)并且想知道是否有办法向网站上的工作人员指出它,但我找不到任何东西。 最佳
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
(来源:azureedge.net) 我的代码存储库位于 GitHub 中,我的管道在 Azure DevOps 中配置。 我需要让 Azure DevOps 检查和过滤提交到我的 GitHub 存储
我想编写一个函数,从列表中删除尾随的 nil。我首先尝试用递归优雅地写它,但结果是这样的: (defun strip-tail (lst) (let ((last-item-pos (positi
我在 git review 上得到以下内容: git review You are about to submit multiple commits. This is expected if you
我正在使用 Apple iTunes Connect 网站。我希望我的 iPhone friend 可以通过 testflight 安装我的应用程序。我的 friend 不属于我的工作团队,因此他没有
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我在 visual studio 2010 中使用 git 进行源代码控制。我可以使用诸如“git status”、“git commit”之类的命令,但是当我尝试使用“git review”时,我得
我是一名优秀的程序员,十分优秀!