有什么方法可以避免在C++中使用非法指针吗

Is there any method to avoid using illegal pointer in C++?

本文关键字:非法 指针 C++ 什么 方法 可以避免      更新时间:2023-10-16

我有一个复杂的类a:

class A{
...
};

而类B是include A的指针,并且具有返回指针的方法。

class B{
A* GetA(){return pA;}
A* pA;
};

然后,当我使用"GetA"获取a的指针时,更容易使用非法指针,如:

void func(A* p){
B b;
p = b.GetA();
}

当我使用"func"时,我只得到一个非法的指针。上面的代码只是一个示例。我发现在多线程环境中很容易犯这个错误。

有什么方法可以让我确信避免这些错误吗?

非常感谢

C++中没有保护自己免受非法指针访问的通用方法,但可以使用一些习惯用法来帮助保护自己。

将类保持为表示概念/对象,并且不要公开对它们可能包含的任何指针的直接访问。例如,首选描述性方法,或容器类begin/end风格的方法。

在管理指针时,最好先使用标准容器,如vector。它们经过高度调优和调试,可以避免许多问题,因为它们已经拥有了所有正确的构造函数、赋值、析构函数等。

如果无法使用标准容器,请根据指针的需要选择智能指针,如unique_ptrscoped_ptrshared_ptrweak_ptr。通过使用适当的智能指针,您几乎不可能无意中犯下编码错误。

即使使用所有这些指导原则,你也可以绕过你试图实施的任何保护措施。如果你发现自己用了很多石膏,你应该退后一步,重新审视你的设计。

在您的情况下,我不仅会使pA不能通过访问器访问,而且也不会使其成为原始指针。

如果将构造函数中的指针初始化为NULL:

class B {
    B() {
        pA = NULL;
    }
    A* GetA(){return pA;}
    A* pA;
}

然后你可以在使用它之前检查指针是否为非NULL

void func(A* p){
    B b;
    p = b.GetA();
    if(p != NULL) {
        //use p
    }
}

此外,似乎很奇怪的是,你传递了一个指向函数的指针,然后在不首先使用它的情况下为其赋值。p = b.GetA();不会更改func之外的任何内容。也许你想做这样的事?

//Caller passes reference to their pointer, caller's pointer gets set.
void func(A *&p) {
    B b;
    p = b.GetA();
}
//Caller passes pointer to their pointer, caller's pointer gets set.
void func(A **p){
    B b;
    if(p != NULL) {
        *p = b.GetA();
    }
}