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

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

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

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

17.05.2011, 21:35. Просмотров 407. Ответов 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++
нужно ли вообще деструктор класса делать виртуальным? class base_class1 { public: base_class1() { data = new...

выходной файл - C++
Записать выходной файл, разделить каждое число на полусумму первого отрикательного и 50-го числа файла. Помогите пожалуйста с этой...

выходной файл - C++
Обясните пожалуста,непойму как мне сделать дальше??? Вот условие задачи: Записать выходной файл, добавив к каждому числу первое...

Выходной файл - C++
Записать выходной файл добавить каждому числу среднее арифметическое наименьшее обсолютной величине и наибольшого из чисел #include...

С++ Файл выходной - C++
1)Записать выходной файл, добавить к каждому числу среднее арифметическое наименьшего по абсолютной величине и наибольшего из чисел файла ...

Записать в выходной файл - C++
Дан текст на русском языке. Записать в выходной файл слова в порядке возрастания длины слова.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alex_x_x
бжни
2447 / 1652 / 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
бжни
2447 / 1652 / 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
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
17.05.2011, 22:48 #8
Да мне всё равно, мне надо знать, какого результата ты ждёшь от проги. Тупо: что твоя прога делает? Я же не могу догадаться комментов в ней нет.
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
17.05.2011, 22:57  [ТС] #9
Ошибка была в скобках при выделении памяти.=/
Всем спасибо, тема закрыта.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2011, 22:57
Привет! Вот еще темы с ответами:

Выходной exe файл - C++
Привет. собственно учусь на 1м курсе... пишем программки в компиляторах... значит когда-то там мы теоретически сможем создать какую-то...

Выходной параметр функции - C++
Прошу прощения за глупый вопрос:) но не понимаю почему к примеру в коде void getline(char s, int lim) { int c,i; for(i=0;i&lt;lim-1...

Функция выравнивания текста в выходной файл - C++
Всем привет форумчане. Преподаватель дал задачу, написать функцию, которая берет строки из входного файла (in.txt) и центрирует их и...

Вывести в выходной файл монотонные слова - C++
не могу найти ошибку в проге, помоги, плиз Входной файл состоит из одной строки. Размер строки не ограничен и её необходимо считывать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.05.2011, 22:57
Ответ Создать тему
Опции темы

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