问题标签 [double-free]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
554 浏览

c - 释放 2D 数组 - 双重释放或损坏

我有以下代码,它只是动态地创建一个矩阵,并根据用户给程序的维度用一些随机值填充它:

前面的代码在我称为“initialize()”的函数中。它在 main() 内部调用。引用的结构在头文件中:

但我得到一个未定义的行为。有时,它有效,有时则无效。例如:对于输入 5(行)和 6(列),我得到以下输出:

注意: simple_randomInput()是一个 fct。它只是返回rand() % 10的结果。为简洁起见,我没有添加它。

我希望有人能帮帮忙。我认为我在释放分配的内存空间方面犯了一个错误,但我确实遵循了其他关于分配/释放 2D 数组的教程,并且他们所做的与我所做的完全相同。不过,我得到了未定义的行为。

0 投票
1 回答
4832 浏览

c++ - 使用 shared_ptr 时的 SEGFAULT

我正在尝试使用 C++实现基于惰性并发列表的集合shared_ptr。我的理由是unreachable nodes最后一个会自动释放shared_ptr。根据我的理解,对 a 的递增和递减操作shared_ptr's reference count是原子的。这意味着只有参考该节点的最后一个 shared_ptr应该为该节点调用delete/free。我为多个线程double free called运行程序,但我的程序因错误或只是Segmentation Fault(SIGSEGV)而崩溃。我不明白这怎么可能。下面给出的是我的实现代码,方法名称表示它们的预期操作。

我无法弄清楚上面的代码有什么问题。错误每次都不同,其中一些只是SEGFAULTS

您能否指出我在上面的代码中做错了什么?以及如何解决该错误?
编辑:添加了一个非常粗略test function的随机调用三个list methods. 此外,线程数和每个操作的数量是全局声明的。粗略的编程,但它重新创建了SEGFAULT

0 投票
0 回答
1414 浏览

python - pygattlib 错误:“python”中的错误:双重释放或损坏(fasttop)

我一直在尝试使用这个pygattlib

我完全按照文档中提到的所有步骤进行操作。我在 Raspberry Pi 3 以及运行 RASPBIAN STRETCH LITE(内核版本:4.9)的 Raspberry Pi Zero W 上进行了尝试。我还尝试使用 Python 2.7.13 和 Python 3.4.3 构建/运行它,但是在运行任何示例脚本时我总是遇到同样的错误。在修复了与缺少库相关的一些问题后,make 和 make 安装运行良好。我什至在全新安装的 Raspbian Stretch Lite 上尝试过这个,同样的错误。我尝试在bitbucket上寻求解决方案,但似乎还有其他人发布了相同的问题并且没有答案。我在另一个窗口中运行了 hcidump,我可以看到发生了一些连接,但是又出现了这个错误

这是运行 hcidump 的结果

我正在运行的示例代码(连接)是这样的

甚至其他脚本似乎也表现出相同的行为

我刚刚做了一个 gdb 回溯,结果如下

0 投票
1 回答
505 浏览

c++ - Boost.Test 中的异常双倍免费

我在集群上执行 Boost.Test 测试用例时遇到问题。错误是:*** glibc detected *** ...myprogram.test: corrupted double-linked list: 0x000000000096b4d0 ***

在此运行 valgrind 给了我:

GDB 的堆栈跟踪如下所示:

当抛出任何未捕获的异常(包括测试失败)时,以及在某些(当前未知的)场合下,都会发生这种情况。但是异常崩溃是 100% 可重现的。

该程序似乎很好,因为它在本地运行而没有任何此类崩溃。所以我认为这是由于集群上某些模块之间的不兼容造成的。

为避免这种情况,我重新编译了 Boost 和 OpenBLAS,但我仍在使用其他几个库,我不想重建(需要很多时间)只是为了测试它们中的每一个。这些是 libSSH2、GPI2、HDF5,尽管它们没有出现在 ldd 中,所以我假设静态链接(我不是测试的作者)并认为它们不太可能导致问题:

根据我的发现,我认为第二个免费是“正确”的,因为它是释放内存的智能指针。所以第一次删除是错误的,但它来自内部exit,这对我没有帮助。

我怎样才能找到,为什么以及如何指针是双重释放的?请注意,我在集群上没有 root,因此 GCC 库的调试符号不可用。

使用的编译器是 GCC 7.1 和 Boost 1.65.1,尽管我已经尝试过其他 Boost 版本和 GCC 5.3

我将一个测试用例简化为:

  • 链接到库
  • BOOST_AUTO_TEST_CASE(...)
  • std::runtime_error

所以问题出在库的静态初始化/完成中。

0 投票
1 回答
359 浏览

c++ - std::vector 使用 back()、pop_back()、push_back(),得到“双重释放或损坏”错误

我有以下代码:

这段代码的重点是评估海龟将遵循的公理字符串。这是一个 L 系统,L 系统的部分要点是有分支,当有一个“[”字符时会发生这种情况,这意味着旋转和位置被保存并将在以后使用。例如,如果我的 L 系统类包含字符串"[PPPPrrFp[[X]PX]pXRR]",我将收到以下错误: *** Error in /home/user/program/dist/Debug/GNU-Linux/world': double free or corruption (fasttop): 0x0000000003f43240 ***

我知道逐步完成这个程序并不容易,我不希望任何人这样做。我只是想知道是否很容易看出程序有什么问题。我知道该错误可能与使用某些 std::vector 方法/函数有关,但我不知道它为什么或如何导致它。

此外,它并不一致。有时程序会顺利运行,有时会因我提到的错误而崩溃。

偏航、俯仰和滚动的功能应该无关紧要。

从我用谷歌搜索的内容来看,我只能在处理具有构造函数、析构函数的类以及删除数组等时找到此错误的示例。

谢谢你的帮助!我希望很明显正在发生的事情并且不会花费太多时间。如果看起来确实需要太长时间,请不要打扰。再次感谢。

编辑:为了更容易理解函数中发生的事情,我将逐步解释函数:从公理字符串的索引 0 开始并检查它是否开始一个新分支 ('[') ,如果确实如此,则推送/保存 3D 向量 pos 和 rot -> 如果当前字符不是 '[' 或 ']' 则移动 pos 或旋转 -> 如果分支结束 (']') 从最后一个恢复保存 pos 和 rot,并弹出堆栈顶部 -> 继续处理字符串中的每个字符。

0 投票
1 回答
55 浏览

c++ - 下一个尺寸无效和双倍免费错误

我这里有一些非常简单的代码行,但它们给了我一些严重的错误消息。

1.我的代码:

  1. 以下是我输入时的错误消息100000 10000 1

    /li>

stdout 中的第一行是正确的答案,但它给出了这个错误!

0 投票
1 回答
56 浏览

c++ - 为什么我的重载赋值运算符在初始化时没有被调用?

我创建了一个测试类来演示重载赋值运算符的使用,以及与双重释放内存相关的陷阱。这个类的代码如下:

而且我有两个主要功能正在使用重载的赋值运算符测试这个类。我将每个主要功能的输出直接放在它的主体下方。

主要1:

输出 1:(按预期工作)

主要2:

输出 2(不按预期工作):

这很奇怪。由于某种原因,指针指向同一个内存,并且id字段是相同的。它应该是不同的。似乎调用了默认赋值运算符。我不知道为什么会这样。

不要试图批评程序本身。这只是出于教育目的的测试。我故意设置了这个,这样我就有了一个双重免费的错误。重载的赋值运算符旨在防止这种情况。它没有通过第二次测试......为什么会这样?

0 投票
1 回答
318 浏览

c++ - 使用全局声明的向量时 C++ 中的双重免费错误/损坏

对于这段代码,

我得到了我想要的输出但是在 main 执行'return 0'之后,我得到了这个错误

我使用另一个代码得到了答案,但我想了解为什么此代码会出现此错误。

我认为 SpreadTheWord() 没有任何问题,但以防万一你想看看 SpreadTheWord() 做了什么

谢谢!

编辑:对不起,我忘了附加输入

问题来自这里:https ://www.codechef.com/SNCKQL19/problems/SPREAD2

0 投票
0 回答
568 浏览

c++ - 带有对的向量 push_back 的双重释放或损坏(输出)?

我有以下基本主程序:

下面是 asd 文件,它是一个类文件:

这里发生了什么?我没有使用任何指针进行操作。我基本上有一个名为 asd 的类,它将一对整数的向量作为数据成员。在我的主程序中,我创建了一个 asd 类对象并调用输入函数。输入函数只是循环到 400 并调用 tAdd 函数。这个函数基本上擦除向量的第一个元素,如果它达到最大大小,则调整它的大小。然后,有一个将一对整数推回的语句。这是问题所在,它实际上从未达到必须调整向量大小的地步。它总是在第 8 次迭代时崩溃,我知道它是导致它的推回功能。此外,错误是这样的:

double free or corruption(out)
Aborted (core dumped)

0 投票
1 回答
1321 浏览

c - 双重释放或损坏 (!prev) 中止 (核心转储) C 语言中的错误

你好 Stack Overflow 社区,我正在课堂上学习 C 语言,我被要求制作这个小项目,该项目使用 libcurl 在网站中搜索有关特定货币和价值的某些信息。由于这个错误,我已经到了可以继续的地步,我一直在互联网上搜索相同错误的答案,但我似乎没有找到它在哪里如果有人可以向我解释我做错了什么会很高兴谢谢。