- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在查看这个错误的含义,它似乎意味着我不止一次释放同一个对象。我似乎无法弄清楚如何防止这种情况。任何帮助或建议将不胜感激。
File(randname)
File(a.out)
~File(a.out)
~Directory(randname)
~File(null)
~File()
*** glibc detected *** a.out: double free or corruption (fasttop): 0x0804b048 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6ff0b)[0xb74baf0b]
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb7671b4f]
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdaPv+0x1b)[0xb7671b9b]
a.out[0x8048983]
a.out[0x8048b12]
a.out[0x80487d7]
/lib/libc.so.6(__libc_start_main+0xf3)[0xb7464003]
a.out[0x8048701]
======= Memory map: ========
08048000-08049000 r-xp 00000000 00:25 268562602 /home/user/test/a.out
08049000-0804a000 r--p 00000000 00:25 268562602 /home/user/test/a.out
0804a000-0804b000 rw-p 00001000 00:25 268562602 /home/user/test/a.out
0804b000-0806c000 rw-p 00000000 00:00 0 [heap]
b7448000-b744b000 rw-p 00000000 00:00 0
b744b000-b75b2000 r-xp 00000000 08:01 1365267 /lib/libc-2.14.1.so
b75b2000-b75b4000 r--p 00167000 08:01 1365267 /lib/libc-2.14.1.so
b75b4000-b75b5000 rw-p 00169000 08:01 1365267 /lib/libc-2.14.1.so
b75b5000-b75b8000 rw-p 00000000 00:00 0
b75b8000-b75d3000 r-xp 00000000 08:01 1179017 /usr/local/gcc/gcc-cilk/lib/libgcc_s.so.1
b75d3000-b75d4000 r--p 0001a000 08:01 1179017 /usr/local/gcc/gcc-cilk/lib/libgcc_s.so.1
b75d4000-b75d5000 rw-p 0001b000 08:01 1179017 /usr/local/gcc/gcc-cilk/lib/libgcc_s.so.1
b75d5000-b75fe000 r-xp 00000000 08:01 1365275 /lib/libm-2.14.1.so
b75fe000-b75ff000 r--p 00028000 08:01 1365275 /lib/libm-2.14.1.so
b75ff000-b7600000 rw-p 00029000 08:01 1365275 /lib/libm-2.14.1.so
b7622000-b7624000 rw-p 00000000 00:00 0
b7624000-b770b000 r-xp 00000000 08:01 1179021 /usr/local/gcc/gcc-cilk/lib/libstdc++.so.6.0.19
b770b000-b770f000 r--p 000e7000 08:01 1179021 /usr/local/gcc/gcc-cilk/lib/libstdc++.so.6.0.19
b770f000-b7710000 rw-p 000eb000 08:01 1179021 /usr/local/gcc/gcc-cilk/lib/libstdc++.so.6.0.19
b7710000-b7718000 rw-p 00000000 00:00 0
b7718000-b7737000 r-xp 00000000 08:01 1365260 /lib/ld-2.14.1.so
b7737000-b7738000 r--p 0001f000 08:01 1365260 /lib/ld-2.14.1.so
b7738000-b7739000 rw-p 00020000 08:01 1365260 /lib/ld-2.14.1.so
bfa18000-bfa39000 rw-p 00000000 00:00 0 [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
Aborted
代码如下:
#include <unistd.h>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
class File
{
protected:
unsigned char recordLen;
unsigned location;
unsigned fileSize;
unsigned char filenameLen;
char* filename;
public:
File(){filename = NULL;}
File(FILE* readFromHere, const char* name)
{
recordLen = 152;
location = 20003;
fileSize = 16348;
filenameLen = strlen(name);
filename = new char[filenameLen + 1];
strcpy(filename, name);
cout << "File(" << filename << ")\n";
}
File(const File& o)
{
if (o.filename == NULL)
filename = o.filename;
else
{
filename = new char[o.filenameLen + 1];
strcpy(filename, o.filename);
}
}
~File()
{
if (filename)
cout << "~File(" << filename << ")\n";
else
cout << "~File(null)\n";
if (filename != NULL)
delete[] filename;
}
};
class Directory : public File
{
protected:
int numContents;
File* contents;
public:
Directory(FILE* readFromHere, const char* name)
: File(readFromHere, name)
{
numContents = 2;
contents = new File[numContents];
contents[0] = File(readFromHere, "a.out");
//~ contents[1] = File(readFromHere, "otherfile.cpp");
}
~Directory()
{
if (filename)
cout << "~Directory(" << filename << ")\n";
else
cout << "~Directory(null)\n";
if (contents != NULL)
delete[] contents;
}
};
int main()
{
Directory d(NULL, "randname");
sleep(2);
return 0;
}
最佳答案
您的类(class)不遵循 Rule of Three即使它拥有资源。您有一个复制构造函数和一个析构函数,但没有复制赋值运算符。这意味着这一行:
contents[0] = File(readFromHere, "a.out");
调用默认的复制赋值运算符,它会愉快地复制指针。这是你的双重删除问题。
关于c++ - Glibc 错误 : double free or corruption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20100396/
void *insert_rear_node(void *arg) { int *argument=(int *)arg; int value=*argument; //Assume
嘿,我的代码在执行后说“帐户”已损坏... 这是什么意思,我该如何解决? #include #include using namespace std; class BankAccount { pr
我正在使用 PHP 创建一个应用程序并涉及 MySQL。如果在请求过程中发生错误,我将如何“将查询分组在一起”,检查它是否会成功,然后对真实表进行实际影响。如果对表的实际更新失败,则恢复到更新之前的状
我正在尝试在 CentOs6 上使用 EasyBuild 编译 tensorflow,但 Bazel 捕获了错误的 binutils 目录,不幸的是,这是一个硬编码目录,以错误的汇编器结尾。 如果我尝
我正在尝试在 OS X Mavericks 上创建一个 AppleScript 库。我已将文件保存到 ~/Library/Script Libraries作为脚本包;它有一个正确的(据我所知;见下文)
我在 Eclipse Indigo 中开发 Android 项目已经有一年了,该 PC 已关闭更新且未安装任何新软件(故意避免 java 运行时或其他已安装软件出现任何不稳定)。 今天早上 Eclip
我正在开发一个简单的 React.JS 前端部分。 我本质上有一个用于历史数据的浏览 SPA。该设计有一堆过滤器,我需要一次填充一个过滤器,从逻辑层次结构中的顶部过滤器开始。 我做了类似的事情:
我已经搞乱了我的代码有一段时间了......现在当我运行它并在菜单中单击第二个选项时,当我输入超过 15 个字符的密码时,我收到此错误?谁能看到我做错了什么?这可能是一些我无法发现的小事谢谢 错误:
我有一个正在尝试构建的“单词”链接列表,我创建了一个名为“add_to_mem”的函数,它将下一个单词添加到链接列表中。我对代码进行了几次检查,发现他工作了两次 - 一次当链接列表为 NULL 时,一
我遇到了这个错误 *** Error in `./main': double free or corruption (out): 0x000000000095c8a0 *** getPieces()定
我的 jni 代码中有 malloc 问题。该代码旨在让我访问 java 中的 exiv2 库。我尝试使用 sun 和 openjdk 1.6.0 虚拟机以及 1.7.0(测试版)虚拟机破坏代码。 错
使用 visual studio 2013,我一直在尝试运行下面的代码,但是当变量 vertexPointer 达到数字 7172 时,我以某种方式收到“堆已损坏”异常。有时我会收到错误消息:“未加载
是否有一个约定俗成的errno代码表明指定的文件已损坏(它不符合应有的文件格式)? 我正在编写文件解析器,但不知道要返回的最合适的代码是什么。总是有 EINVAL,虽然我希望有比这更具体的东西,因为它
我的 date.php 是 -
这可能是个愚蠢的问题,但我在运行 *.jar 包时随机出现以下错误。有时程序运行完美,有时会中断,将其输出到控制台: *** Error in 'java': double free or corru
当运行脚本来筛选 抓取 网页时,我遇到“zend_mm_heap 已损坏”。请让我知道如何解决此问题。 最佳答案 我假设您正在使用带有 mod_php 的 Apache 来回答这个问题。 当 apac
我有将十六进制字符串转换为字节数组的函数, BYTE* HexStrToByteArray(std::wstring hex_str) { int len = hex_str.size()*0
请不要为了这个把我钉在十字架上。我决定使用 char* 可能更好,因为我打算构建的字符串的大小已知。我还知道,如果 timeinfo->tm_hour 返回的不是 2 位数字,那么事情就会变得很糟糕。
我有一个包含 vector 的类 (foo)。 如果我尝试像这样遍历 vector 中的元素: for(vector::iterator it = foo.getVector().begin();
每当我从我的 Remote 中 pull 出时,我都会收到以下关于压缩的错误。当我运行手动压缩时,我得到了相同的结果: $ git gc error: Could not read 381378312
我是一名优秀的程序员,十分优秀!