如何检查无效的 address/deleted 指针?

How to check invalid address/deleted pointer?

我是 c++ 的新手,我被这个问题困住了。 我将一个结构指针(Bar*)附加到一个向量,该结构有一个指针 class 成员(Foo*)。

struct Bar
{
    const int  var{ 0 };

    Foo* m_foo{ nullptr };
};

std::vector<Bar*> list;

int main()
{
  Bar* p_Bar = new Bar;
  p_Bar->m_foo = new Foo;
  list.emplace_back(p_Bar);
}

我有一个线程检查这些指针的有效性。删除这些指针后,矢量元素应该存在,我应该检查两个指针​​是否有效。 当其中任何一个无效时,我应该删除该矢量元素(我的意思是检查后)。 这是我的尝试:

#include <iostream>
#include <vector>
#include <thread>

class Foo
{
public:
    Foo() {};

    const int var{ 5 };
};

struct Bar
{
    const int  var{ 0 };

    Foo* m_foo{ nullptr };
};

std::vector<Bar*> list;

bool _check = true;
void Check()
{
    while (_check)
    {
        for (int c = 0; c < (int)list.size(); c++)
        {
            Bar* p = list[c];

            if (p)
            {
                if (p->m_foo)
                {
                    std::cout << "m_foo->var:" << p->m_foo->var << "\nEnter anything to delete the element: ";
                }
                else
                {
                    std::cout << "m_foo was nullptr";
                }
            }
            else
            {
                std::cout << "Element was invalid";
            }
        }
        std::this_thread::sleep_for(std::chrono::duration(std::chrono::seconds(2)));
    }
}

int main()
{
    Bar* p_Bar = new Bar;
    p_Bar->m_foo = new Foo;

    list.emplace_back(p_Bar);

    std::thread thread1(Check);
    thread1.detach();

    std::string t;
    std::cin >> t;

    if (list[0]->m_foo)
        delete list[0]->m_foo;
    if (list[0])
        delete list[0];
    list.clear();

    std::cin >> t;

    _check = false;

    return 0;
}

要检查指针是否被删除,我应该使用NULLnullptr,这实际上意味着0。 但是一旦指针被删除,地址将是这样的 0xFFFFFFFFFFFFFFFF 并且 IDE 将抛出这种异常:

Exception thrown: read access violation.
p->m_foo was 0xFFFFFFFFFFFFFFFF.

如何检查指针的deleted/pointer地址是否有效?

How to check whether the pointer's deleted/pointer's address is valid or not?

无法检查指针是有效还是无效。如果指针有效或为空,则可以检查它是哪一个。如果指针无效,则比较结果将不确定。

除了比较无效指针外,您的程序还有另一个错误:您在一个线程中删除,并在另一个线程中访问指针而不同步操作。同样,您正在访问向量的元素,而它的元素在另一个线程中被删除。程序的行为未定义。


P.S。避免拥有裸指针。

您可以使用 automatic_ptr class 代替 classic in-build 指针。 您可以自己开发,或使用例如。 std::unique_ptr 和 std::shared_ptr。 classes 的原理是,该指针包含在 class 和 class 计数外部链接(指针...)中并将其存储到内部属性中。 在C++的每一本书中都有它的例子。