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

показывает вот сюда if (*pb++ != bCheck) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Shtolz
 Аватар для Shtolz
5 / 5 / 0
Регистрация: 10.10.2008
Сообщений: 138
20.09.2011, 15:17     показывает вот сюда if (*pb++ != bCheck) #1
Здравствуйте =)
Проблема следующая

после работы вот этого кода

main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void _tmain(int argc, _TCHAR* argv[])
{
    MyMatrix A(2);
    A.Init();
 
    MyMatrix B(2);
    B.Init();
 
    MyMatrix C(2);
    C.Init();
 
    (A.Transp()*B-B*C).Print();
}
MyMatrix.cpp
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "StdAfx.h"
#include "MyMatrix.h"
using namespace std;
 
MyMatrix::MyMatrix() 
    {
        arr = 0;
        size = 0;
    }
    
    MyMatrix::MyMatrix(int _size) 
    {
        arr = 0;
        size = _size;
        
        arr=(int**)malloc(size*sizeof(int*));
        for(int i=0; i<size; i++)
            arr[i]=(int*)malloc(size*sizeof(int));
    }
    
    void MyMatrix::Init()
    {
        for(int i=0;i<size;i++)
        {
            for(int j=0;j<size;j++)
            {
                cin>>arr[i][j];
            };
        };
    }
 
    void MyMatrix::Print()
    {
        int i,j;
        for(i=0;i<this->size;i++)
        {   
            cout<<"  \n";
            for(j=0;j<size;j++)
            {
                cout << arr[i][j]<<" ";
            };
        }
        cout <<" \n" ;
    }
    
    
    MyMatrix::~MyMatrix() 
    {
        if (arr)
        {
            for(int i=0; i<size; i++)
            {
                if (arr[i])
                    free(arr[i]);
            }
        free(arr);
        }
    }
 
    MyMatrix& MyMatrix::Transp()
    {
        MyMatrix *mTemp = new MyMatrix(size);
        
        for (int i=0;i<size;i++)
        {
            for(int j=0; j<size; j++)
            {
                mTemp->arr[i][j] = arr[j][i];
            }
        }
 
        return *mTemp;
    }
 
    MyMatrix& MyMatrix::operator *(MyMatrix M2)
    {
        MyMatrix *mTemp = new MyMatrix(size);
        for(int i=0;i<size;i++)
        {
            for(int j=0;j<size;j++)
            {
                mTemp->arr[i][j] = 0;
                for(int k=0;k<size;k++)
                {
                    mTemp->arr[i][j] += arr[i][k] * M2.arr[k][j];
                }
            }
        }
 
        return *mTemp;
    }
 
    MyMatrix& MyMatrix::operator -(MyMatrix M2)
    {
        MyMatrix *mTemp = new MyMatrix(size);
        
        for (int i=0;i<size;i++)
        {
            for(int j=0; j<size; j++)
            {
                mTemp->arr[i][j] = arr[i][j] - M2.arr[i][j];
            }
        }
 
        return *mTemp;
    }

выскакивает ошибка указывающая вот сюда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
extern "C" static int __cdecl CheckBytes(
        unsigned char * pb,
        unsigned char bCheck,
        size_t nSize
        )
{
        while (nSize--)
        {
      ->> if (*pb++ != bCheck)
            {
                return FALSE;
            }
        }
        return TRUE;
}
при чем уже после вывода готовой матрицы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2011, 15:17     показывает вот сюда if (*pb++ != bCheck)
Посмотрите здесь:

загляните пожалуйста сюда... C++
Посмотрите сюда C++
C++ Кому легко, сюда
Ikis Всем знающим,сюда.Пожалуйста.Готов заплатить. C++
C++ Бинарные деревья ! кому интересно , сюда!;)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
22.09.2011, 16:27     показывает вот сюда if (*pb++ != bCheck) #21
товарищ, какие режимы линковки? это UB! никто не гарантирует, что в следующий раз программа не выпадет в синий экран и отформатирует тебе жёсткий диск. Программа падает совсем не из-за того что глючит free, виндус или скайнет, free работает правильно, ошибку выдаёт по делу. Кончай уже втирать эту байку про чудодейственный Release и отстойный Debug, а иди исправляй свои программы, потому что судя по этому сообщению там есть, что исправлять:
Я уже с таким встречался free иногда "гонит беса на пустом месте"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 16:46     показывает вот сюда if (*pb++ != bCheck) #22
Цитата Сообщение от LosAngeles Посмотреть сообщение
что в следующий раз программа не выпадет в синий экран и отформатирует тебе жёсткий диск.
- это тебе
Цитата Сообщение от LosAngeles Посмотреть сообщение
иди исправляй свои программы, потому что судя по этому сообщению там есть, что исправлять
- раз такое пишешь и не понимаешь различий Debug и Release иди сам учи язык, а на счёт этого ты 100% уверен что free всегда отрабатывает - мой ответ конечно же нет!

Добавлено через 2 минуты
LosAngeles, мой экзешник вылетел, выпал в синий экран я жду примеров, а то бросаешся тяжеовесными выссказываниями, ну давай уж приведи пример некорректной работы, я жду...
LosAngeles
Заблокирован
22.09.2011, 16:59     показывает вот сюда if (*pb++ != bCheck) #23
человек который дважды удаляет память по одному указателю и обращается к освобождённой памяти решает эту проблему изменив опции компиляции и советует мне при этом идти учить язык... У меня остался только один вопрос - ты мастер-классы проводишь?
LosAngeles
Заблокирован
22.09.2011, 17:03     показывает вот сюда if (*pb++ != bCheck) #24
АХАХАХА!!! решил проверить, хотя впринципе и так ясно что код полное говно. Просто проверить заработает или нет. Первый запуск, прилагаю скриншоты
Миниатюры
показывает вот сюда if (*pb++ != bCheck)   показывает вот сюда if (*pb++ != bCheck)  
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 17:18     показывает вот сюда if (*pb++ != bCheck) #25
Цитата Сообщение от LosAngeles Посмотреть сообщение
АХАХАХА!!! решил проверить, хотя впринципе и так ясно что код полное говно.
LosAngeles,
LosAngeles, ты вобще смотре кто ТС и о чьём коде говорим, мне твой компилятор в Debug не нужен что ты скрины кидаешь, о которых уже 15 постов назад сказал показывает вот сюда if (*pb++ != bCheck)

Добавлено через 2 минуты

Не по теме:

LosAngeles, или разберись в топике или млин не рви мне мозг



Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а в том что free в Debug глючит
по поводу сего вот єто имел ввиду а в том что free в ряде случаев(особенно на старых компиляторах) в Debug глючит...

LosAngeles, это тебе, я специально ввёл try catch в деструкторе, компилируй, вводи маттрицы запускай, ну что вылетело исключение, ммм?!!Да провожу прям сейчас
Цитата Сообщение от LosAngeles Посмотреть сообщение
ты мастер-классы проводишь?
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "MyMatrix.h"
#include <windows.h>
 
LPSTR StrWinError(HRESULT hRes)
{
    LPSTR errString = NULL;  // will be allocated and filled by FormatMessage
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM, // use windows internal message table
        0,       // 0 since source is internal message table
        hRes,    // this is the error code 
                          // Could just as well have been an error code from generic
                          // Windows errors from GetLastError()
        0,       // auto-determine language to use
        (LPSTR)&errString,
        0,       // min size for buffer
        0 ); 
    return errString;
}
 
MyMatrix::MyMatrix() 
{
    arr = 0;
    size = 0;
}
        
MyMatrix::MyMatrix(int _size) 
{
    arr = 0;
    size = _size;
                
    arr=(int**)malloc(size*sizeof(int*));
    for(int i=0; i<size; i++)
        arr[i]=(int*)malloc(size*sizeof(int));
}
        
void MyMatrix::Init()
{
    for(int i=0,j;i<size;i++)
    for(j=0;j<size;j++)
    {
        cout<<"arr["<<i + 1<<"]["<<j + 1<<"] = ";
        cin>>arr[i][j]; 
    }
}
 
void MyMatrix::Print()
{
    for(int i=0,j;i<this->size;i++)
    { 
        for(j=0;j<size;j++)
            cout << arr[i][j]<<" ";
        cout <<" \n" ;
    }
}
        
MyMatrix::~MyMatrix() 
{
    try
    {
    if ((void *)arr != NULL)
    {
        for(int i=0; i<size; i++)
            if ((void *)arr[i] != NULL)
                free((void *)arr[i]);
        free((void *)arr);
    }
    }
    catch(...)
    {
        MessageBox(NULL,StrWinError(GetLastError()),"TRYCATCH",MB_OK);
    }
}
 
MyMatrix& MyMatrix::Transp()
{
    MyMatrix *mTemp = new MyMatrix(size);        
    for(int i=0,j;i<size;i++)
    for(j=0; j<size; j++)
        mTemp->arr[i][j] = arr[j][i];    
    return *mTemp;
}
 
MyMatrix& MyMatrix::operator *(MyMatrix M2)
{
    MyMatrix *mTemp = new MyMatrix(size);
    for(int i=0,j,k;i<size;i++)
    {
        for(j=0;j<size;j++)
        {
            mTemp->arr[i][j] = 0;
            for(k=0;k<size;k++)
                mTemp->arr[i][j] += arr[i][k] * M2.arr[k][j];
        }
    }
    return *mTemp;
}
 
MyMatrix& MyMatrix::operator -(MyMatrix M2)
{
    MyMatrix *mTemp = new MyMatrix(size);
    for (int i=0,j;i<size;i++)
    for(j=0; j<size; j++)
        mTemp->arr[i][j] = arr[i][j] - M2.arr[i][j];
    return *mTemp;
}
MyMatrix.h
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
#ifndef MATRIX
#define MATRIX
 
#include <iostream>
#include <cstdlib> //malloc
using namespace std;
 
class MyMatrix
{
private:
    int ** arr;
    int size;
public:
    MyMatrix();
    MyMatrix(int _size);
    ~MyMatrix();
    void Init();
    void Print();
    MyMatrix& Transp();
    MyMatrix& operator *(MyMatrix M2);
    MyMatrix& operator -(MyMatrix M2);
};
 
#endif
main.cpp
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
#include "MyMatrix.h"
#include <conio.h>
 
void main()
{
    do
    {
        MyMatrix A(2);
        std::cout<<"Init A\r\n";
        A.Init();
 
        MyMatrix B(2);
        std::cout<<"Init B\r\n";
        B.Init();
 
        MyMatrix C(2);
        std::cout<<"Init C\r\n";
        C.Init();
 
 
        (A.Transp()*B-B*C).Print();
        cout<<"Press Y - to new input\r\n";
    }
    while(toupper(getch()) == 'Y');
}
LosAngeles
Заблокирован
22.09.2011, 17:19     показывает вот сюда if (*pb++ != bCheck) #26
-=ЮрА=-, с каких пор free выбрасывает С++ные исключения?! к слову сказать delete объявлен с пустой спецификацией исключений и тоже не выбрасывает исключений

Что именно тебе непонятно:
1) Ты не видишь, что память освобождается дважды? а также идёт обращение к освобождённой памяти?
2) Видишь, но считаешь что это вполне нормально и решается с помощью переключения опций компиляции?
если первое я могу попытаться объяснить почему это так, хотя тут всё доходчиво написано показывает вот сюда if (*pb++ != bCheck)
а если второе то это no comments вобще

Добавлено через 43 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ты вобще смотре кто ТС и о чьём коде говорим, мне твой компилятор в Debug не нужен
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
LosAngeles, Release поставь
ты вобще скрин смотришь? там Release версия!
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 17:35     показывает вот сюда if (*pb++ != bCheck) #27
Цитата Сообщение от LosAngeles Посмотреть сообщение
2) Видишь, но считаешь что это вполне нормально и решается с помощью переключения опций компиляции?
- я думаю в случае Release, здесь if ((void *)arr != NULL) скорее всего arr == NULL(т.к. память некорректно выделяется) и free в деструкторе вообще не вызывается!
Сначала однин, теперь другой, не рвите мне мозг!ТС удовлетворился, потому что не в 10-ке пишет и там трюки с Releas-ом проходят. Уже писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- вобще свой класс CMatrix по другому построил и что мне нужно было выкладывать его?Понятное дело постоянное выделение памяти под двумерный массив очень скоро загробит оперативку и заставит приложение опрокинуться. Проблемму решил так как понятно Shtolz, на его уровне
LosAngeles
Заблокирован
22.09.2011, 17:56     показывает вот сюда if (*pb++ != bCheck) #28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
и free в деструкторе вообще не вызывается!
то есть ты не понял, что free вызывается дважды для одного и того же адреса. Окей, а то я уже подумал, что ты пытаешься протолкнуть идею, что это нормально освобождать память по одному адресу дважды. В посте сантехника же написано почему это происходит пошагово, что именно в нём непонятно? Проблема возникает в том что в операторах * и - создаётся копия матрицы, которая содержит тот же arr, что и оригинал. Копия уничтожается, делая оригинал недействительным, адрес указателя не обнуляется, а остаётся тем же. Затем при выходе из _tmain вызывается деструктор для оригинала, который содержит невалидный указатель. Что будет если попытаться освободить память по указателю, который указывает на мусор? ЭТО И БУДЕТ!!! Проблема сразу исчезает, если написать конструктор копирования

Добавлено через 4 минуты
и кстати если в эти самые операторы передавать матрицы по ссылке, а не по значению, то глюк тоже пройдёт. Но этот способ ничем не лучше переключения на Release версию, это я так к слову сказал, чтобы ещё раз обратить внимание на то, что глюк именно в отстутсвии КК, если кто-то ещё не понял
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2011, 16:35     показывает вот сюда if (*pb++ != bCheck)
Еще ссылки по теме:

вот такой вот пример C++
C++ Вот такое вот кажется лёгкое задание но не как не могу решить.
Ребята капец сюда опытные программеры C++

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

Или воспользуйтесь поиском по форуму:
Shtolz
 Аватар для Shtolz
5 / 5 / 0
Регистрация: 10.10.2008
Сообщений: 138
23.09.2011, 16:35  [ТС]     показывает вот сюда if (*pb++ != bCheck) #29
Всем спасибо!! и отдельно CAHTEXHUK, за объяснение ошибки
Yandex
Объявления
23.09.2011, 16:35     показывает вот сюда if (*pb++ != bCheck)
Ответ Создать тему
Опции темы

Текущее время: 03:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru