0 / 0 / 0
Регистрация: 29.08.2014
Сообщений: 214
1

Ошибка этапа исполнения: double free or corruption (fasttop):

18.04.2015, 20:28. Показов 22300. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе времени суток подскажите пожалуйста в чем может быть следующая проблема.
Код который выводит программа приведен ниже.
Сама программа компилиться без проблем.
Код самой программы приведен ниже.
*** glibc detected *** ./main: double free or corruption (fasttop): 0x0000000000ee7030 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f9b36488b96]
./main[0x400b21]
./main[0x400d1b]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f9b3642b76d]
./main[0x400969]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:05 39589275 /home/m2og3/Qt_project/Test_schet/Test_schet/main
00601000-00602000 r--p 00001000 08:05 39589275 /home/m2og3/Qt_project/Test_schet/Test_schet/main
00602000-00603000 rw-p 00002000 08:05 39589275 /home/m2og3/Qt_project/Test_schet/Test_schet/main
00ee7000-00f08000 rw-p 00000000 00:00 0 [heap]
7f9b3610e000-7f9b36209000 r-xp 00000000 08:01 1836406 /lib/x86_64-linux-gnu/libm-2.15.so
7f9b36209000-7f9b36408000 ---p 000fb000 08:01 1836406 /lib/x86_64-linux-gnu/libm-2.15.so
7f9b36408000-7f9b36409000 r--p 000fa000 08:01 1836406 /lib/x86_64-linux-gnu/libm-2.15.so
7f9b36409000-7f9b3640a000 rw-p 000fb000 08:01 1836406 /lib/x86_64-linux-gnu/libm-2.15.so
7f9b3640a000-7f9b365bf000 r-xp 00000000 08:01 1836395 /lib/x86_64-linux-gnu/libc-2.15.so
7f9b365bf000-7f9b367bf000 ---p 001b5000 08:01 1836395 /lib/x86_64-linux-gnu/libc-2.15.so
7f9b367bf000-7f9b367c3000 r--p 001b5000 08:01 1836395 /lib/x86_64-linux-gnu/libc-2.15.so
7f9b367c3000-7f9b367c5000 rw-p 001b9000 08:01 1836395 /lib/x86_64-linux-gnu/libc-2.15.so
7f9b367c5000-7f9b367ca000 rw-p 00000000 00:00 0
7f9b367ca000-7f9b367df000 r-xp 00000000 08:01 1831468 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f9b367df000-7f9b369de000 ---p 00015000 08:01 1831468 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f9b369de000-7f9b369df000 r--p 00014000 08:01 1831468 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f9b369df000-7f9b369e0000 rw-p 00015000 08:01 1831468 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f9b369e0000-7f9b36ac2000 r-xp 00000000 08:01 789900 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f9b36ac2000-7f9b36cc1000 ---p 000e2000 08:01 789900 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f9b36cc1000-7f9b36cc9000 r--p 000e1000 08:01 789900 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f9b36cc9000-7f9b36ccb000 rw-p 000e9000 08:01 789900 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f9b36ccb000-7f9b36ce0000 rw-p 00000000 00:00 0
7f9b36ce0000-7f9b36d02000 r-xp 00000000 08:01 1836407 /lib/x86_64-linux-gnu/ld-2.15.so
7f9b36ede000-7f9b36ee3000 rw-p 00000000 00:00 0
7f9b36efe000-7f9b36f02000 rw-p 00000000 00:00 0
7f9b36f02000-7f9b36f03000 r--p 00022000 08:01 1836407 /lib/x86_64-linux-gnu/ld-2.15.so
7f9b36f03000-7f9b36f05000 rw-p 00023000 08:01 1836407 /lib/x86_64-linux-gnu/ld-2.15.so
7fff1b214000-7fff1b235000 rw-p 00000000 00:00 0 [stack]
7fff1b3fe000-7fff1b400000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
Код программы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <string.h>
 
 
class Record{
    char * sstring;
    double sum;
    long int lenght;
public:
    Record();
    Record(const Record &);
    ~Record();
    void Enter(const char *, double);
    void Display();
};
 
Record::Record(){
    lenght = 2;
    sstring = new char[2];
    strcpy(sstring, "0");
    sum = 0;
}
 
Record::Record(const Record &r){
    lenght = r.lenght;
    char * ss = new char[strlen(r.sstring) + 1];
    delete [] sstring;
    strcpy(ss, r.sstring);
    sstring = ss;
    sum = r.sum;
}
 
Record::~Record(){
    delete [] sstring;
}
 
void Record::Enter(const char * st, double su){
    lenght = strlen(st) + 1;
    char * ss = new char[lenght];
    strcpy(ss, st);
    delete [] sstring;
    sstring = ss;
    sum = su;
}
 
void Record::Display(){
    std::cout<<"Record: "<<sstring<<" ,sum "<<sum<<std::endl;
}
 
 
int main(void){
 
    Record a;
    Record b;
    Record c;
 
    a.Enter("a", 0);
    b.Enter("b", 0);
    c.Enter("c", 0);
    a.Display();
    b.Display();
    c.Display();
 
    a = b;
    b = c;
    a.Display();
    b.Display();
    c.Display();
 
    return 0;
}

Всем заранее благодарю за ответы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2015, 20:28
Ответы с готовыми решениями:

Ошибка: double free or corruption (fasttop)
Я описываю метод diamond-square. Это метод для процедурной генерации мира (кому интересно - вот...

Double free or corruption при изменении размера динамического массива
Сразу скажу, что у меня задание на работу с памятью, и std::vector по условию использовать...

Ошибка этапа исполнения
Доброго времени суток! Хочу разобраться с ошибкой, буду благодарна за помощь) Вот код функции: ...

Ошибка этапа исполнения
Всем доброго времени суток! Пытаюсь решить вот эту задачу: В ряд выложены N кучек камней, в i-ой...

8
Модератор
Эксперт С++
13504 / 10755 / 6410
Регистрация: 18.12.2011
Сообщений: 28,707
18.04.2015, 20:43 2
Как обычно - забыли правило Трех
(копиконструктор, operator=, деструктор)
Распространенные ошибки
1
0 / 0 / 0
Регистрация: 29.08.2014
Сообщений: 214
18.04.2015, 20:45  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
Как обычно - забыли правило Трех
(копиконструктор, operator=, деструктор)
Распространенные ошибки
Действительно дописал оператор=
C++
1
2
3
4
5
6
7
8
Record & Record::operator =(const Record &r){
    lenght = r.lenght;
    char * ss = new char[strlen(r.sstring) + 1];
    delete [] sstring;
    strcpy(ss, r.sstring);
    sstring = ss;
    sum = r.sum;
}
проблема исчезла

просто не вьеду почему так бывает?(((
0
Модератор
Эксперт С++
13504 / 10755 / 6410
Регистрация: 18.12.2011
Сообщений: 28,707
18.04.2015, 20:50 4
Если Вы не написали operator=, то используется присвоение по умолчанию,
которое копирует не значения, а УКАЗАТЕЛИ.
В результате в присваиваемом объекте класса оказывается адрес данных другого экземпляра.
Одно из следствий - повторное удаление памяти в деструкторе.
Кстати, в operator= полезно проверять, чтобы не было присвоений типа a=a;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Record & Record::operator =(const Record &r)
{
   if(this!=&r)
   {
      lenght = r.lenght;
      char * ss = new char[strlen(r.sstring) + 1];
      delete [] sstring;
      strcpy(ss, r.sstring);
      sstring = ss;
      sum = r.sum;
   }
    return *this;
}
Причем, не из соображений экономии ресусов, а из-за возможных логических ошибок.
Вы в своем коде сначала строку скопировали.
А вот если бы сразу удалили this->sstring, то при &r==this одновременно удалилась бы и r.sstring.
0
0 / 0 / 0
Регистрация: 29.08.2014
Сообщений: 214
18.04.2015, 21:51  [ТС] 5
Цитата Сообщение от zss Посмотреть сообщение
Если Вы не написали operator=, то используется присвоение по умолчанию,
которое копирует не значения, а УКАЗАТЕЛИ.
В результате в присваиваемом объекте класса оказывается адрес данных другого экземпляра.
Одно из следствий - повторное удаление памяти в деструкторе.
Кстати, в operator= полезно проверять, чтобы не было присвоений типа a=a;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Record & Record::operator =(const Record &r)
{
   if(this!=&r)
   {
      lenght = r.lenght;
      char * ss = new char[strlen(r.sstring) + 1];
      delete [] sstring;
      strcpy(ss, r.sstring);
      sstring = ss;
      sum = r.sum;
   }
    return *this;
}
Причем, не из соображений экономии ресусов, а из-за возможных логических ошибок.
Вы в своем коде сначала строку скопировали.
А вот если бы сразу удалили this->sstring, то при &r==this одновременно удалилась бы и r.sstring.
Не совсем понял вот это утверждение А вот если бы сразу удалили this->sstring, то при &r==this одновременно удалилась бы и r.sstring.
0
Модератор
Эксперт С++
13504 / 10755 / 6410
Регистрация: 18.12.2011
Сообщений: 28,707
18.04.2015, 23:20 6
В этом случае адрес this (который слева от знака равно) равен адресу &r.
Соответственно this->sstring и r.sstring тоже адресуют одну и ту же память.
0
0 / 0 / 0
Регистрация: 29.08.2014
Сообщений: 214
19.04.2015, 17:17  [ТС] 7
Цитата Сообщение от zss Посмотреть сообщение
В этом случае адрес this (который слева от знака равно) равен адресу &r.
Соответственно this->sstring и r.sstring тоже адресуют одну и ту же память.
C++
1
Соответственно this->sstring и r.sstring тоже адресуют одну и ту же память.
Это почему?
0
Модератор
Эксперт С++
13504 / 10755 / 6410
Регистрация: 18.12.2011
Сообщений: 28,707
19.04.2015, 17:48 8
Ну как тут не понять.
По какой причине программист написал
C++
1
2
Record a;
a=a;
Т.е. присваивание самому себе.
соответственно this->string равно a.string
0
0 / 0 / 0
Регистрация: 29.08.2014
Сообщений: 214
19.04.2015, 18:33  [ТС] 9
Цитата Сообщение от zss Посмотреть сообщение
Ну как тут не понять.
По какой причине программист написал
C++
1
2
Record a;
a=a;
Т.е. присваивание самому себе.
соответственно this->string равно a.string
Это мне понятно. Самоприсваивание)))
0
19.04.2015, 18:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2015, 18:33
Помогаю со студенческими работами здесь

Ошибка этапа исполнения - переполнение стека
Помогите пожалуйста C++ написала программу она правильно работает, но при каждом запуске она...

Ошибка этапа исполнения в классе Матрица
Всем привет снова!) Теперь я написала код по задаче, которая гласит: &quot;у вас есть два класса -один...

Ошибка этапа исполнения при преобразовании символов в верхний регистр
Доброго времени суток, уважаемые пользователи CyberForum.ru! По какой то причине падает программа,...

Ошибка исполнения "Heap corruption detected"
Задача следующая (из книги С. Прата, глава 12): Усовершенствуйте обновление класса String...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru