繁体   English   中英

指向销毁类无效的指针

[英]Pointer to destroyed class invalidation

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

我的想法是列出需要更新为nullptr的指针列表。 这将在对象的析构函数中调用。 对于可能被释放的每件事,都一团糟,繁琐。

在此类情况下,智能指针可能会有一些用处(从未使用过)。 C ++程序员如何处理此类问题?

您只需要使用std :: shared_ptrstd :: weak_ptr即可

shared_ptr非常聪明,您无需删除它们,当没人再引用它们时,它们将被删除。 然后,与此shared_ptr相关的所有weak_ptr都会被通知,并且它没有访问未分配内存的风险。

当需要它时, weak_ptr将尝试lock()并创建一个本地shared_ptr 如果原始的shared_ptr被删除, lock()将无法创建本地shared_ptr并且您可以放心地知道原始指针已被删除。

// 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;
    }
}

令人头疼的混乱局面,以及可能被释放的每件事的繁琐工作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM