Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
#1

Деструтор взял выходной. - C++

17.05.2011, 21:35. Просмотров 402. Ответов 8
Метки нет (Все метки)

Уважаемые знатаки, доброго времени суток.
В процессе написания лабы захотелось одну функцию протестировать отделно от всего осталного.
Написав подобный класс, споивовав деструктор и необходимые для теста функции принялся за дебаг, после чего РАБОЧИЙ в исходном проэкте деструктор отказаля коректно выполняться, причем и в исходнике тоже.
Если не лень, научите уму разуму, ну пожлуйста...
вот собственно текст тестовой программы:
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
#include<iostream>
 
class abc{
int** mass;
int Msize;
public:
    abc(int M,int a,int b){
        Msize=M;
        mass=new int*[Msize];
        mass[0]=new int(a+1);mass[0][0]=a;
        mass[1]=new int(b+1);mass[1][0]=b;
        for(int i=0;i<Msize;i++){
            for(int ii=1;ii<=mass[i][0];ii++)mass[i][ii]=1;
        }
    }
    ~abc(){
        for(int i=0;i<Msize;i++){
        delete[] mass[i];
        }
        delete[] mass;
    }
    void del(int num=0){
        int i,ii;
        GetElem(num,i,ii);
        int j=i,jj=0;
        int* M=new int(mass[i][0]+1);
        for(;jj<=mass[i][0];jj++)M[jj]=mass[j][jj];
        for(int a=1;a<=M[0];a++) std::cout<<M[a];
        delete []mass[i];
        mass[i]=new int(M[0]);
        mass[i][0]=M[0]-1;
        jj=1;
        if(ii<=mass[i][0]){
            while(jj<ii){mass[i][jj]=M[jj];jj++;}
            while(jj<=mass[i][0]){mass[i][jj]=M[jj+1];jj++;}
        }
        else while(jj<=mass[i][0])mass[i][jj]=M[jj];
        delete []M;
    }
friend std::ostream &operator <<(std::ostream& I,abc& param){
        for(int i=0;i<param.Msize;i++){
            for(int ii=1;ii<=param.mass[i][0];ii++){
                /*if(i==param.Msize-1 && ii==param.mass[param.Msize-1][0]) std::cout<<param.mass[i][ii];
                else*/ std::cout<<param.mass[i][ii]/*<<","*/;
            }
            std::cout<<std::endl;
        }
        
        return I;
    }
private:
    void GetElem(int& num,int& i,int& ii){
        int point=0;
        for(i=0;i<Msize;i++){
            int size=mass[i][0];
            for(ii=1;ii<=size;ii++){
                point++;
                if(point==num)break;
            }
            if(point==num)break;
            if(i==Msize-1)i=0;
        }
    }
};
void main(){
    abc a(2,3,4);
    std::cout<<a;
    //a.del(5);
    std::cout<<a;
}
Добавлено через 7 минут
да, и если создавать и удалять точо такой же массив в main ни чего плохого не происходит.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2011, 21:35     Деструтор взял выходной.
Посмотрите здесь:

выходной файл C++
C++ Выходной exe файл
C++ Записать в выходной файл
выходной файл C++
Вывести в выходной файл монотонные слова C++
C++ Выходной параметр функции
Выходной файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.05.2011, 21:56     Деструтор взял выходной. #2
http://codepad.org/NH1S1rl6

у вас ошибки работы с динамической памятью, деструктор вызывается
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
17.05.2011, 22:24  [ТС]     Деструтор взял выходной. #3
А разве я говорил, что он не вызовется, я сказал, что он некоректно выполняется, разрушая кучу.
И почему так происходит мне непонятно, ибо по сути деструтор выполянет удаление много мерного массива, причем самым, что ни есть, стандартным способом....
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.05.2011, 22:28     Деструтор взял выходной. #4
Цитата Сообщение от Глупец Посмотреть сообщение
И почему так происходит мне непонятно, ибо по сути деструтор выполянет удаление много мерного массива, причем самым, что ни есть, стандартным способом....
очевидно либо указатель невалидный, либо по указателю уже память освобождена
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
17.05.2011, 22:33  [ТС]     Деструтор взял выходной. #5
Эм, как бэ по этому указателю(только что проверил), как и ожидалось, лежит первый элемент строки...
Т.е. это как бы и есть указательна начало удаляемого одномерного массива, разве не так?
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
17.05.2011, 22:41     Деструтор взял выходной. #6
Так а почему ты решил, что он как-то неправильно работает? У меня либо ошибка памяти, либо тестирующее сообщение вылезает, в твоём случае наблюдаю милую картину
111
1111
111
1111

После чего прога нормально завершается. Или что-то другое должно быть напечатано?
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
17.05.2011, 22:44  [ТС]     Деструтор взял выходной. #7
Собственно у меня происходит вот это:
"HEAP[verification.exe]: Heap block at 00346068 modified at 00346098 past requested size of 28
ОС Windows инициировала точку останова в verification.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в verification.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит verification.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки"

собственно как раз на строчке delete[] mass[i]; оно и падает, даже проэкт пробовал полностью пересоздать, как-то без успешно(
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
17.05.2011, 22:48     Деструтор взял выходной. #8
Да мне всё равно, мне надо знать, какого результата ты ждёшь от проги. Тупо: что твоя прога делает? Я же не могу догадаться комментов в ней нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2011, 22:57     Деструтор взял выходной.
Еще ссылки по теме:

C++ С++ Файл выходной
C++ виртуальный деструтор
C++ Почему в выходной файл выводит неправильный результат?
C++ Visual C++ 2010. Не открывает входной и выходной файлы
Поместить в выходной файл только трехзначные числа C++

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

Или воспользуйтесь поиском по форуму:
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
17.05.2011, 22:57  [ТС]     Деструтор взял выходной. #9
Ошибка была в скобках при выделении памяти.=/
Всем спасибо, тема закрыта.
Yandex
Объявления
17.05.2011, 22:57     Деструтор взял выходной.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru