如何保护或跟踪指针容易崩溃

How to safeguard or track pointer crashes easily?

本文关键字:易崩溃 崩溃 指针 何保护 保护 跟踪      更新时间:2023-10-16

我发现,当指针在被有效分配之前被使用时,代码经常崩溃,例如:

MyType* p = 0;
p->foo(); // crashes because p is not assigned.

为了保护if,我通常在使用指针(如)之前添加断言语句

assert(p);

但也很容易忘记添加断言。有更好的方法来保护吗?或者有什么工具可以在崩溃发生时帮助定位用户代码上的崩溃?

事实上,我经常使用智能指针来拥有数据。原始指针仅用于引用。例如:

std::unique_ptr<Model> p;
class View
{
public:
    View(Model* model = 0) : m_model(model) {}
    void setModel(Model* model) {m_model = model;}
    Model* model() const {return m_model;}
private:
    Model* m_model;
};

当我忘记为视图设置模型时,问题仍然存在。在大型代码中,很容易忘记执行。

我最喜欢的这类工具是valgrind。在开发过程中,您运行类似valgrind myProg...的程序,它会"告诉"您无效的内存访问、泄漏和其他事情。

但是,对于在取消引用之前添加指针不为null的断言,如果正如您所说的程序在取消引用null时崩溃,那么这似乎有点不必要。添加断言可能会使崩溃的原因更容易跟踪,但可能会有更深层次的问题(即对原始指针的普遍过度使用或误用)。