如何保护或跟踪指针容易崩溃
How to safeguard or track pointer crashes easily?
我发现,当指针在被有效分配之前被使用时,代码经常崩溃,例如:
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时崩溃,那么这似乎有点不必要。添加断言可能会使崩溃的原因更容易跟踪,但可能会有更深层次的问题(即对原始指针的普遍过度使用或误用)。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 隔离易崩溃(SEGV),但将关键的遗留代码加速到一个单独的二进制文件中