- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的团队对于指针容器在特定上下文中的使用存在一些分歧。请考虑:
int main() {
// Top level. This is an important fact to the context
// i.e. that the following instance is at this level
// so that its members are essentially at program scope.
MainClass mainClass;
mainClass.run();
}
// A instance of a class derived from Buffer does something very complex
// (it has various handles to resources/allocated memory) so that you would
// never want to copy an instance.
class Buffer;
class MainClass {
#make_decision_here_based_on_stack_overflow_responses
shared_ptr<Buffer> buffer; // 1
scoped_ptr<Buffer> buffer; // 2
#end_decision
MainClass() {
// non-trivial initialisation of buffer with any of a number of derived classes:
buffer.reset( ... )
}
void run() {
#make_decision_here_based_on_stack_overflow_responses
SomeSubservientClass sub(*buffer); // a
SomeSubservientClass sub(buffer.get()); // b
SomeSubservientClass sub(buffer); // c
#end_decision
sub.do_stuff()
}
};
(我希望你能理解这里的特殊预处理器代码,它实际上并不存在,但如果它存在就好了:)
我们目前拥有的代码处于状态“1b”(shared_ptr 成员,向下传递裸 ptr)但我们认为这不应该是这样。我很想知道任何人乍一看认为什么是最自然/合理和最安全的事情和理由。或者如果有人想建议“3”或“d”。我自己有意见,但还不想分享。
最佳答案
智能指针的选择就是所有权策略的选择。你必须问自己这个问题:
MainClass
是 Buffer
实例的唯一所有者吗?还是存储在 MainClass
中的 Buffer
实例比 MainClass
对象存在时间更有意义? (或者如果 MainClass
成为更大系统的组件并失去其应用程序生命周期状态是否有意义?)如果答案是有道理,使用共享指针。如果答案是sole owner/doesn't make sense,使用表达唯一所有权的东西 - scoped_ptr
(或 std::unique_ptr
,如果可用)。
如果您最终拥有唯一所有权,请使用选项“a”来传递对象。如果空指针是函数的有效输入,则函数只应采用指针参数。
如果您最终拥有共享所有权,则有两种可能的情况。要将缓冲区传递到共享所有权的地方,请传递 shared_ptr
本身。要将其传递到仅观察/修改的地方,请使用上面的 'a'。
关于c++ - 在顶层使用 shared_ptr 而不是 scoped_ptr 有什么优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952182/
我是 boost 库的新手,正在尝试 boost::scoped_ptr,它声明无法复制或移动此智能指针。但是我在玩一些代码时发现了一个问题。我能够创建 scoped_ptr 的新实例并使用现有的有效
我有一个具有以下结构的单例: // Hpp class Root : public boost::noncopyable { public: ~Root();
既然 scoped_ptr 保证给定线程中的所有对象都以类似堆栈的方式分配,那么为 scoped_ptr > , 事实上 std::vector*存储在 scoped_ptr 中与std::vecto
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: What is a smart pointer and when should I use one? 我正在阅
我有一个结构 typedef struct myStruct_st { int a; }myStruct; 可以使用创建 myStruct * myStruct_new() { printf(
假设我实现了一个scoped_ptr: template class scoped_ptr { public: scoped_ptr() = delete; explicit scoped
我的类的一个成员是 boost::scoped_ptr,它在创建对象时设置为 (T*)0。该类有一个 init() 方法,它实际上用一个新对象初始化智能指针。 但是,如果在智能指针具有有效引用之前抛出
谁能解释为什么这个例子中引用类型的转换失败了?我想使用 boost::scoped_ptr 作为缺少 std::unique_ptr 的解决方法。 struct A{}; struct B {
我很惊讶编译器拒绝编译这种代码: class A { virtual ~A() {} }; class B : public A { virtual ~B() {} void foo() {} };
我在 pagePtr.h 中有这样的东西 typedef int (*FunPtrType)(char* sz, unsigned int max_bytes, char* arg1, char* a
我正在尝试理解 boost::scoped_ptr 的语法.让我们定义并写入标准输出 a scoped_ptr指针及其指向的值: #include #include int main() {
通常我会遵循 Google 风格指南,我觉得它与我看待事物的方式非常吻合。我也几乎完全使用 boost::scoped_ptr 以便只有一个管理器拥有特定对象的所有权。然后我传递裸指针,我的想法是我的
检查以下代码: 这个有效: T *p = (std::find( this->first(), this->last(), *pPos )); if( p != last() ) { this
我正在使用可变参数模板,我想找到解压参数的好方法 template class MetaKernel : public MyKernel { public: MetaKernel (
我使用 boost::scoped_ptr 实现了一个简单的单例: template class Singleton : public boost::noncopyable { public:
所以我尝试围绕 boost.extension 函数创建一些包装器来创建类。所以我创建了一个函数: template boost::scoped_ptr get_class (shared_lib
我在像这样的小函数中使用 scoped_ptr。这样我就不必调用 delete 了。这是这种用法的矫枉过正吗?我的团队成员更喜欢原始指针和删除。如果这恰好用在非常关键的路径中,那么使用 scoped_
我刚刚开始使用 C++ boost 库。我在很多地方读到,当使用 scoped_ptr 时,即使出现异常,对象也总是被销毁。 They behave much like built-in C++ po
我正在研究智能指针,尤其是 scoped_ptr。我阅读了运算符 * 和 ->。我试着运行这段代码: int main(){ boost::scoped_ptrnumber(new int);
boost::scoped_ptr documentation包含一个称为 Handle/Body Idiom 的技术示例。它是用以下文字描述的: The scoped_ptr_example_tes
我是一名优秀的程序员,十分优秀!