c – 使用shared_ptr作为输出参数
发布时间:2020-12-16 06:58:52 所属栏目:百科 来源:网络整理
导读:我正在研究一个从DLL导出几个类的C API. 公共类接口应遵循以下约定: 所有函数都返回错误代码. 输出参数用于其他返回值. 传递指针用于输出参数. 传递const引用用于输入参数(传递基本类型的值). 当客户端应该取输出参数shared_ptr的所有权时,否则使用普通指针
我正在研究一个从DLL导出几个类的C API.
公共类接口应遵循以下约定: >所有函数都返回错误代码. 示例界面: typedef std::shared_ptr<Object> ObjectPtr; class APIClass { ErrorCode SetSomething(int i); ErrorCode IsSomethingSet(bool* ask); ErrorCode DoSomething(); ErrorCode GetSomething(ObjectPtr* outObj); } 用法示例: ErrorCode res; ObjectPtr obj; res = myApiClass->GetSomething(&obj); GetSomething实现: ErrorCode APIClass::GetSomething(ObjectPtr* outObj) { ObjectPtr temp(new Object(),CleanUpFunction<Object>); // Do something with object temp. ... *outObj= temp; return OK; } 以这种方式使用shared_ptr是否可以节省,或者我应该注意哪些问题? 解决方法
这很好,但我会问在这种情况下是否真的需要共享指针.主要是因为你无法以任何理智的方式从shared_ptr释放指针……这可能会在以后导致问题.而shared_ptr实际上意味着底层资源的未指定或共享所有权.
我通常记录函数并使用类似的东西: // Caller must delete the outObj once done. ErrorCode APIClass::GetSomething( Object* & outObj ) { // I use auto_ptr so I can release it later... // Mostly I hate auto_ptr,but for this its invaluable. auto_ptr<Object> obj( new Object ); ... outObj = obj.release(); return OK; } 这样,客户端需要将指针存储到其中,并且很明显对象的所有权传递给调用者. 然后,客户端代码可以使用适当的容器. Object * obj_raw; ErrorCode ec = apiClass.GetSomething( obj_raw ) if( ec!=OK ) { .. do something with ec .. } shared_ptr<Object> obj( obj_raw ); 要么 auto_ptr<Object> obj( obj_raw ); 要么 scoped_ptr<Object> obj( obj_raw); 等等 请注意,如果将函数定义更改为: // Caller must delete the return value. // On error,NULL is returned and e filled in appropriately. Object* APIClass::GetSomething( ErrorCode & e ) { auto_ptr<Object> obj( new Object ); .. e = OK; return obj.release(); } //Now using it looks like this: ErrorCode ec; shared_ptr<Object> obj( apiObject.GetSomething(ec) ); if(!obj) { .. do something with ec .. } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |