首页 文章

通过智能指针获取所有权,并通过相同的智能指针进一步访问原始指针

提问于
浏览
0

我有一个像这样的漏洞代码:

void f() {
  SomeClass *sc = new SomeClass;
  ...
  if (...) {
    g(sc); // g() takes ownership of memory pointed to by sc
  }
  ...
  sc->SomeMethod();
  ...
}

我想通过使用智能指针消除泄漏,想到以下解决方案:

void f() {
  smart_ptr<SomeClass> sc(new SomeClass);
  ...
  if (...) {
    g(sc.release()); // ownership is taken
  }
  ...
  sc->SomeMethod(); // sc points to the allocated memory regardless of whether ownership was taken or not
  ...
} // the memory is freed if ownership was not taken

试图使用std :: unique_ptr和std :: shared_ptr . std :: unique_ptr在发布后指向空指针,std :: shared_ptr根本没有release() . 手动增加std :: shared_ptr的引用计数器会有所帮助,但正如我所理解的那样,也没有这样的能力 .

想到使用std :: unique_ptr以及原始指针除了代码之外,每次将原始指针传递给获取所有权的函数时只调用release(),但这是一个非常混乱的解决方案 .

我想知道标准库中是否有适合我目标的智能指针,或者在我的情况下是否有一个想法或常见的技巧怎么办或者我可能遗漏了什么?

3 回答

  • 0

    只需更多代码,您就可以保留本地非拥有视图:

    void g(std::unique_ptr<Foo> p);     // takes ownership
    
    int main()
    {
        auto p = std::make_unique<Foo>();
        Foo & local_view = *p;
    
        if (/* condition */) { g(std::move(p)); }
    
        local_view.do_stuff();
    }
    
  • 0

    我不明白你对 g 取得所有权的意思,因为在 g 退出后你仍然会使用指针 . 如果你总是想在 g 之后使用指针,那么将原始指针传递给 g 并在块的末尾解除分配指针会更有意义 .

    如果你确实希望 g 取得所有权,并且只想在指针仍然存在的情况下调用 SomeMethod ,则将原始指针传递给 g 并让它返回一个原始指针 . 如果指针在 g 中被取消分配,则返回 nullptr 并在 SomeMethod 调用之前检查该指针 .

  • 3

    您可以使用 shared_ptr 具有相同的效果 . shared_ptr 没有 release() 函数,但它有一个 reset() 函数,这是我认为你正在寻找的 . 但是,您必须等到调用 SomeClass::SomeMethod() 后才能调用 sc.reset() .

    void g(shared_ptr<SomeClass> ptr);
    
    void f()
    {
       shared_ptr<SomeClass> sc(new SomeClass);
    
       if (/* check for condition */)
       {
          g(sc);
       }
    
       sc->SomeMethod();
       sc.reset();
    }
    

相关问题