如何在我的 c++ 代码中获取运行时的双重释放错误
How to get the double free error on run time in my c++ code
我在 c++ 代码中使用 Jansson 库。在库中创建任何 Jansson 变量时,应该释放该变量以释放引用,我正在使用"json_decref(json_t *json)"方法来释放。但有时它会导致双重释放问题,我在运行时没有遇到问题。也许这不正常,但我想在尝试发布一些引用时出现运行时错误。例如,我正在运行以下测试代码,
json_t *root = json_loads(any_json_message, 0, &error);
json_decref(root);
json_decref(root);
如您所见,存在问题,我没有收到任何运行时错误,例如双重释放。
另外,我正在使用CMake来编译我的源代码。也许任何 cmake 标志都可以解决我的问题。
知道吗?
释放,访问指向对象的行为是未定义的。文档没有详细说明,但多次调用json_decref
(加上您在指针上调用json_incref
的次数)也有未定义的行为。
也许这不正常,但我想在尝试发布一些引用时出现运行时错误。
好吧,杨松不会给你这个。
编译器可能会提供一个运行时分析器,该分析器可能能够检测某些未定义的行为并通过消息终止程序。有关如何使用分析仪的信息,请参阅编译器的手册。
文档说json_t
包含引用计数。我猜第一次调用 json_decref
会将引用计数从 1 减少到 0 并释放内存。对 json_decref
的第二次调用看到引用计数为 0,并且不执行任何操作。
若要生成双重释放错误,应复制 json_t
对象的旧内容。像这样的东西(但不是字面意思;见下文):
json_t *root = json_loads(any_json_message, 0, &error);
json_t copy = *root;
json_decref(root);
json_decref(©);
但是,json_t
(我猜)是一种不透明的类型,也就是说,用户只能创建指向它的指针,而不能创建对象。要强制创建对象的副本,您可以猜测json_t
对象的大小,并使用memcpy
:
json_t *root = json_loads(any_json_message, 0, &error);
char copy[42];
memcpy(copy, root, sizeof copy);
json_decref(root);
json_decref((json_t *)copy);
尝试使用各种尺寸(而不是 42),直到它起作用。但是,我不确定您能否使其工作 - 这只是对该库内部如何工作的猜测。
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 运行时错误:引用绑定到类型为"int"的空指针
- 为什么当 vector 为空时会显示运行时错误?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 运行时错误:矢量下标超出范围:正在检查空集
- 分配给gslice_array会导致运行时错误
- cout 新创建的对象引发运行时错误
- C++在使用std::multimap时出现运行时错误的几率很小
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 试图找出为什么我会收到运行时错误?
- 迭代二维矢量时发生运行时错误
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误