0

我有一个复杂的 A 类:

class A{
...
};

B 类是包含 A 的指针,并且有一个返回指针的方法。

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

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

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

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

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

非常感谢

4

2 回答 2

2

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

保持你的类代表概念/对象,不要直接访问它们可能包含的任何指针。更喜欢例如描述性方法,或类似容器的类begin/end样式方法。

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

如果无法使用标准容器,则更喜欢智能指针,例如unique_ptr, scoped_ptr,shared_ptrweak_ptr取决于您的指针需要。通过使用适当的智能指针,您几乎不可能无意中犯下编码错误。

即使使用所有这些准则,您也始终可以绕过您尝试实施的任何保护。如果你发现自己使用了很多演员表,你应该退后一步重新检查你的设计。

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

于 2012-08-02T16:55:09.560 回答
0

如果将构造函数中的指针初始化为 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();
    }
}
于 2012-08-02T17:00:48.163 回答