有什么方法可以避免在C++中使用非法指针吗
Is there any method to avoid using illegal pointer in C++?
我有一个复杂的类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_ptr
、scoped_ptr
、shared_ptr
或weak_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();
}
}
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 使用指针向量到参考向量是非法的吗?
- 指向引用的指针是非法的
- 为什么是非法的:将指针向量复制到指向常量的指针向量中
- 为什么使用构造函数调用表示法定义指向指针变量的指针是非法的
- 有什么方法可以避免在C++中使用非法指针吗
- 指向未指定大小的数组的指针在C++"(*p)[]"非法,但在 C 语言中是合法的
- C++ 非法间接寻址数组和指针
- 错误C2823:typedef模板是非法的-函数指针
- 将const int赋值给指向int的const指针是非法的
- 指向非法引用的成员的指针
- 从ROOT(cern)使用AddFriend时出现"非法指针"错误
- 为什么const指针中的结构操作是非法的
- 为什么指向未定义结构的指针在C和c++中有时是非法的