如何在关联指针时编写无错误的代码
How to write a bug-free code when a pointer is associated?
例如
struct A
{
void foo() {};
};
struct B
{
B() {}
void setA(A* a) { mA = a; }
foo() { mA->foo(); }
A *mA;
};
B
中有一个关联的A
(只是一个地址)。B::mA
绝不能null
.我通常忘记setA
并引入错误。有什么好的做法可以避免它?下面setA
怎么样?
void B::setA(A& a) { mA = &a; }
最好的方法是首先避免使用指针。如果必须使用指针,请考虑使用智能指针,例如 std::unique_ptr
或 std::shared_ptr
。并且始终始终初始化指针,要么为 null(除非您使用智能指针)或已分配的内容。并且始终在使用它们之前始终检查空值。
首先,也是最重要的事情,是永远不要留下指针初始 化。 至少,将其设置为 nullptr
(或NULL
pre-C++11) 在构造函数中,因此您至少可以测试它的有效性后。
除此之外,很大程度上取决于它应该指向什么:
-
如果它所指向的内容的生命周期保证会超过对象的生存期(在两个方向上:它存在于您的之前对象已构造,并且在对象被构造后将继续存在析构),将其作为对构造函数的引用传递,并获取用于初始化指针的引用的地址。
-
如果它所指向的内容的生命周期可能要到您的之后才能开始对象是构造的,则必须在构造函数,在
setA
函数中分配给它,并验证它是否为不是每次要使用它时都为空。 -
如果它所指向的内容的生存期可能会在您的对象之前结束破坏了,那么你需要观察者模式的某种变体,通知您的对象指向的对象已被破坏,并将指针设置为 null。 在这种情况下,您还必须检查每次使用前都为空。 过去,我使用过
ManagedPtr
为此,但这不是一个通用的解决方案。 (它将使指针清空,但是如果指针在地图或其他东西中,这通常是在这种情况下,它不会从地图中删除该条目。 -
如果对象的生存期应影响指向对象,那么您应该考虑使用
std::shared_ptr
.我发现这种情况在实际代码中非常罕见,但它们确实会发生。(请注意,如果您确实使用std::shared_ptr
,则必须非常非常小心。 您只能从任何给定构造一个std::shared_ptr
原始指针不会遇到问题。 在我们自己的代码库中,我们已经禁止std::shared_ptr
,并使用我们自己的侵入性参考计数指针,以避免此类问题。std::shared_ptr
精心设计,以最大限度地提高悬空指针的风险和多次删除同一对象。
如果对象总是在对象之前初始化B
则使用引用作为首选:
struct B
{
B(A& a) : mA(a) {}
foo() { mA.foo(); }
A& mA;
};
A a;
B b(a);
"我通常忘记设置A,并且引入了错误。
所以强迫自己通过构造函数来设置它:
struct B
{
public:
B(A *a) : ma(a) {}
private:
A *mA;
};
让我们foo
检查一下:
foo()
{
if (mA)
mA->foo();
else
// handle it, throw exception, ignore, ...!
}
- 错误处理.将系统错误代码映射到泛型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么我在使用void函数时得到错误代码C2276
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 逻辑运算符上出现错误代码 a')'
- 'val' Arduino 错误代码之前的预期'('
- 我在贪吃蛇游戏中收到了错误代码 -1073741571
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- 创建进程 API 失败,在窗口 122 上出现错误代码 10
- 使用另一个函数调用一个函数(都在类中)时出现问题.没有错误代码C++
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- WSALookupServiceBegin() 上的错误代码 10022(无效的 arugment)
- C++ Schannel POST 400 错误代码错误请求
- openCL-创建子缓冲区返回错误代码13
- 错误代码:无匹配函数供呼叫
- 无操作员错误代码
- 如何在关联指针时编写无错误的代码