代码之家  ›  专栏  ›  技术社区  ›  GRASBOCK

指向已破坏类无效化的指针

  •  0
  • GRASBOCK  · 技术社区  · 7 年前

    我有一个很多指针指向的对象。他们经常尝试访问数据。然而,在某些时候,这个对象可能会被破坏。如何在销毁对象后立即有效地更新这些指针,使它们不会指向未分配的内存并导致未定义的行为?

    我的想法是列出需要更新的指针 nullptr . 这将在对象的析构函数中调用。糟糕的一团糟,每一件可能被交易的事情都需要大量的工作。

    也许在这些智能指针中,对于类似的情况有一些用处(从未使用过它们)。C++程序员如何处理这样的事情?

    2 回复  |  直到 7 年前
        1
  •  3
  •   jpo38    7 年前

    你只需要使用 std::shared_ptr std::weak_ptr .

    shared_ptr 非常聪明,你不需要删除它们,当没有人再引用它们时,它们就会被删除。然后,任何 weak_ptr 与此有关 SelddPPTR 会被告知,并且不会有风险访问未分配的内存。

    当它需要它的时候 弱者PTR 将尝试 lock() 并创建一个本地 SelddPPTR . 如果原件 SelddPPTR 被移除, 锁定() 将无法创建本地 SelddPPTR 您将安全地知道原始指针已被删除。

    // Example program
    #include <iostream>
    #include <assert.h>
    #include <memory>
    
    int main()
    {
        std::shared_ptr<int> pI( new int(3) );
        std::weak_ptr<int> wI( pI );
    
        {
            // check if weak_ptr still "points" to some valid data:
            std::shared_ptr<int> pICopy = wI.lock();
            assert( pICopy != NULL );
            std::cout << "pI still valid " << *pICopy << std::endl;
        }
    
        pI.reset(); // this is equivalent to regular delete with shared_ptr
    
        {
            // check if weak_ptr does not "point" to any valid data:
            std::shared_ptr<int> pICopy = wI.lock();
            assert( pICopy == NULL );
            std::cout << "pI not valid anyore" << std::endl;
        }
    }
    
        2
  •  0
  •   Syed Waris    7 年前

    难看的混乱和每件可能被处理的事情的大量工作

    好吧,不要在析构函数中进行清理。生成一个单独的函数并在析构函数中调用它。您可以从其他对象的析构函数中调用此公共清理函数。