问题标签 [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 回答
751 浏览

c++ - 在 C++ 中使用递归方法时双重释放或损坏(fasttop)

我实现了一个 Stack 类并试图利用该类来解决 Hanoi 问题。这是我的代码:

上面声明Stack class并实现pop()push()功能。现在,我声明我的 Hanoi 类并实现函数。

这是我的测试代码:

输出是:

我认为这个问题发生在 ~Hanoi 被调用时,但我真的不知道为什么会这样。

在这里,我发布了可以得到这个结果的整个代码:my_node.h

3_4.h

3_4.cpp

我使用的命令:

0 投票
3 回答
3005 浏览

c++ - 字符串分配双重释放或损坏错误

我在这里的字符串分配有错误。这是我们编写的用于存储从 url 获取的数据的函数。编辑:数据节点结构

page_node->url = url 行导致 Double free 或损坏,数据按值传递,而不是按引用传递。有人能指出出了什么问题吗?

谢谢,我把结构变成了一个类,问题完全解决了。谢谢!但我仍然想知道这一点,为什么用 malloc 进行结构内存管理在 C++ 中是有问题的。结构在 C++ 中使用非常频繁。

0 投票
0 回答
1907 浏览

c++ - 动态库双重释放或损坏

我正在为考试做一个程序。

如果我使用静态库,我会成功编译我的程序并且它可以工作。我使用ROOT(cern)的库来管理数据并绘制直方图。这里有使用 Valgrind http://pastebin.com/KwMBvFG7的 memcheck 的输出(我的文件在 /home/riccardo/Desktop/braggPlot_v05 中:只需在 pastebin 中搜索它以查看与我的代码相关的错误。

当我制作动态库时,我将我的源代码分成不同的包,然后用这个 bash 脚本编译它们

如果我运行“runStat,runDump,runHist”一切顺利。如果我运行“runAll”(即“包括”runStat、runDump、runHist),我会得到双重释放或损坏。我已经从我的代码中取消了所有“删除”运算符,以查看问题出在哪里......我完全不知道在做什么。这里有使用 Valgrind http://pastebin.com/ZzSR9rYR的 memcheck 的输出(我不知道如何解释它)。

这是我在 runAll 结束时得到的 Backtrace 和 memorymap

0 投票
2 回答
2749 浏览

c++ - 链接到两个第 3 方共享库时,c++ 程序崩溃

我有两个用于 linux 平台的外包共享库(没有源代码,没有文档)。这些库在单独链接到程序时工作正常(g++ xx.cpp lib1.so 或 g++ xx.cpp lib2.so)。

但是,当任何 c++ 程序同时链接到这两个共享库时,程序不可避免地会崩溃并出现“double free”错误(g++ xx.cpp lib1.so lib2.so)。

即使 c++ 程序是一个的hello world 程序并且与这些库无关,它仍然会崩溃。

生成文件:

我得到了一些线索,这些 lib1.so lib2.so 库可能共享一些公共全局变量,并且它们两次破坏了一些变量。我尝试过 gdb 和 valgrind,但无法从回溯中提取有用信息。

有什么办法可以隔离这两个共享库并使它们以沙盒方式工作?

已编辑(添加核心转储和 gdb 回溯):

我只是将上述玩具空helloword程序与两个库(平台:centos 7.0 64bits with gcc4.8.2)链接起来:

瓦尔格林:

gdb 回溯消息:

更新

感谢@RaduCivu 的帮助,我发现了一个非常相似的场景: segmentation fault at __tcf_0 when program exits,看起来两个库之间确实存在全局变量冲突。考虑到我没有这两个外部共享库的源文件,除了使用两个单独的进程,还有其他方法可以解决这个冲突吗?

0 投票
1 回答
958 浏览

c++ - 为什么会发生这种双释放错误?

我有一个基类和一个派生类:

在啊:

在 A.cpp

在 Bh 中:

主要.cpp:

现在我将 A.cpp 和 B.cpp 编译成两个独立的共享库,分别为“a.so”和“b.so”,然后将它们链接到 Main.cpp。当我运行程序时 - 它以损坏的双链表错误退出。使用 valgrind 运行我看到有一个无效的免费错误。为什么会这样?

我知道每个 .so 文件都必须有自己的静态全局变量副本,但是当派生类在不同的共享库中而基类在不同的共享库中并且基类中有静态变量时会发生什么?如何跨存在派生类的库为基类中的静态变量分配/销毁内存?

0 投票
2 回答
1221 浏览

c++ - std::shared_ptr 的 use_count 增加的所有方式是什么?

我有两个shared_ptrs 指向同一个int,即调用get()它们返回相同的地址。但是调用use_count()它们会返回1。当它们中的最后一个超出范围时,它会尝试释放已经被另一个释放的内存,从而导致双重释放运行时错误:

同样的事情发生在这个变体中,带有显式声明的原始指针:

如果两个s 都指向同一个东西,为什么use_count()返回1(而不是)?如果返回,那么为什么要尝试释放两次?我认为 a当且仅当它指向与它的兄弟s相同的地址时才会增加一。2shared_ptruse_count()1intshared_ptruse_countshared_ptr

a 是否仅由 first由原始指针构造(或分配给原始指针,如果默认构造)然后通过附加s std::shared_ptr'复制构造或任何先前s 分配来增加?如果有的话,还有哪些其他的递增方式?use_countshared_ptrshared_ptrshared_ptr

0 投票
2 回答
489 浏览

c++ - 双重免费或腐败 - 为什么?

当我试图在 main 中制作两个矩阵时,第一个维度低于第二个维度,就会发生 double free 。当两个矩阵的维数相同,或者第一个矩阵的维数高于第二个时,就没有问题。也许有人可以看到代码并告诉我有什么问题?

编辑:主要:

0 投票
1 回答
146 浏览

c - 释放二维数组的双重免费错误

我正在开发一个使用二维数组作为字段的结构的程序。但由于某种原因,我每次尝试使用 free_planet 函数时都会收到双重释放错误。使用程序作为 valgrind 似乎问题是第 49 行到第 51 行的说明,但我真的不明白为什么。

0 投票
2 回答
156 浏览

c - 在不应该出现的地方出现两次 free()

我有一个令人沮丧的问题,我找不到答案。

我有这个功能:

由于某种原因,我的程序最后尝试执行两次 free 。

我使用 AppendChar() 的代码是:(有点难看,但请耐心等待)

而我的主要:

在我创建 it_GetCharCmd() 并在那里使用它之前,AppendChar() 一直没有问题。我在这上面花了大约 3 个小时,但我找不到问题所在。在互联网上进行了一些搜索,但我发现的东西与我的问题并不完全相关。

0 投票
1 回答
2612 浏览

c++ - 在 C++ 中正确退出分叉进程

阅读如何结​​束 C++ 代码的答案,我了解到exit从 C++ 代码调用是不好的。但是,如果我派生了一个子进程,该子进程必须在某个地方结束并且在调用堆栈的深处如此之深,以至于将其退出代码传递给 main 是不可能的?

我找到了一些替代方法来做到这一点 - 诚然,这已经变得有点冗长,但请耐心等待:

选项 0

可能是最糟糕的:

问题是,没有调用testin的析构函数,因为std::exit只是忽略了任何具有自动存储的对象。更糟糕的是,析构函数被调用了两次fork_option0unique_ptr

选项1

析构函数也存在同样的问题,fork_option1因为std::_Exit也忽略了自动存储。至少unique_ptr析构函数只被调用一次。

选项 2

这似乎有效,析构函数被正确调用。

选项 3

这是从主要建议返回的最接近的近似值,但是它有几个问题:

尽管fork_option3正确调用了其中的析构函数,但发生了两次双重释放。首先是unique_ptr,其次是 中的对象fork_this

选项 4

比选项三略好,因为双倍免费unique_ptr已经消失了。然而,其中的对象fork_this仍然是双重释放的。

那么退出/结束子进程的正确方法是什么?

从上面的实验看来,选项 2 效果最好。但是,我可能错过了其他问题std::_Exit(请参阅如何结束 C++ 代码