Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995

Попытка чтения или записи в защищенную память

20.08.2010, 21:06. Показов 2797. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Вылетает на delete[], возникла какая то проблема с памятью, только вот какая ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) 
         {
                Bitmap^ bm;
                Matrix mnew(30,30);
                Matrix mint(30,30);
                Matrix mas(30,30);
                char *p=new char[30];
                int k=6;
                bm=gcnew Bitmap("C:/" + k.ToString()+ ".bmp");
                int w=bm->Width;
                int h=bm->Height;
                mas.SetSize(w,h);
                for(int i=0;i<w;i++)
                    for(int j=0;j<h;j++)
                    {
                    mas(i,j)=(bm->GetPixel(i,j).R+bm->GetPixel(i,j).G+bm->GetPixel(i,j).B)/3;               }
                To(&mnew,mas,15,15);// <<< Вылетает тут
                ToIntegralImage(&mint,mnew);
                p=itoa(k, p, 10);
                mint.SaveToFile(p);
            }
в Matrix.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Matrix
{
private:
    int* m;
    int width;
    int height;
public:
    Matrix(int Width=1,int Height=1);
    Matrix(Matrix &obj);
    Matrix& operator=(Matrix &obj);
    int& operator()(int i, int j);
    void SetMatrix(int* obj,int Width,int Height);
    void SetSize(int Width,int Height);
    int GetWidth();
    int GetHeight();
    int GetSize();
    void SaveToFile(char* filename);
    void LoadFromFile(char* filename);
 
    int RetValue(int i,int j);
};
в Matrix.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
Matrix::Matrix(int Width,int Height)
{
    width=Width;
    height=Height;
    m=new int[width*height];
}
int& Matrix::operator()(int i, int j)
{
    return(m[i*width+j]);
}
void Matrix::SetMatrix(int* obj,int Width,int Height)
{
    width=Width;
    height=Height;
    for(int i=0;i<width*height;i++) m[i]=obj[i];
}
void Matrix::SetSize(int Width,int Height)
{
    delete[] m;                           // <<< Вылетает тут
    width=Width;
    height=Height;
    m=new int[width*height];
}
int Matrix::GetWidth() 
{
    return(width);
}
int Matrix::GetHeight()
{
    return(height);
}
int Matrix::GetSize()
{
    return(height*width);
}
int Matrix::RetValue(int i,int j)
{
    if ((i>0)&&(j>0)) return(m[i*width+j]);
    else return(0);
}
void Matrix::SaveToFile(char* filename)
{
 FILE *stream;
 fopen_s (&stream,filename, "w");
  for(int i=0;i<height;i++)
    {
     fprintf(stream,"\n "); 
     for(int j=0;j<width;j++) fprintf(stream,"%d ",m[i*width+j]);
    }   
fclose (stream);
}
void Matrix::LoadFromFile(char* filename)
{
 FILE *stream;
 fopen_s (&stream,filename, "r");
  for(int i=0;i<width;i++)
    {
     for(int j=0;j<height;j++) fscanf_s(stream,"%d ",&m[i*width+j]);
    }   
fclose (stream);
}
Matrix::Matrix(Matrix &obj)
{
    width=obj.GetWidth();
    height=obj.GetHeight();
    m=new int[width*height];
    for(int i=0;i<width;i++)
        for(int j=0;j<height;j++) m[i*width+j]=obj(i,j);
}
Matrix& Matrix::operator=(Matrix &obj)
{
    width=obj.GetWidth();
    height=obj.GetHeight();
    m=new int[width*height];
    for(int i=0;i<width;i++)
        for(int j=0;j<height;j++) m[i*width+j]=obj(i,j);
    return(*this);
 
}
Внешняя функция
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
void To(Matrix* MNew,Matrix& M,int Width,int Height)
{
    int OldWidth=M.GetWidth();
    int OldHeight=M.GetHeight();
    float S=0;
    MNew->SetSize(Width,Height);                           ///<<< Вылетает тут
    float HorStep=float(OldWidth+1)/float(Width+1);
    float VerStep=float(OldHeight+1)/float(Height+1);
    float numbers=HorStep*VerStep;
 
    for(int i=0;i<Width;i++)
    {
        for(int j=0;j<Height;j++)
        {
            S=0;
            for(int k=int(i*HorStep);k<int((i+1)*HorStep);k++)
            {
                for(int l=int(j*VerStep);l<int((j+1)*VerStep);l++)
                {
                    S=S+M(k,l);
                }
            }
            (*MNew)(i,j)=S/numbers;
        }
    }
}
Добавлено через 4 часа 49 минут
попытался по максимум убрать лишнее ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e)
         {
            Matrix mnew;
            Matrix mas;
            int w=22;
            int h=20;
            mas.SetSize(w,h);
            for(int i=0;i<w;i++)
                for(int j=0;j<h;j++)
                {
                    mas(i,j)=10;
                }
                        
            mnew.SetSize(w,h);
                            
         }
вылетает на mnew.SetSize(w,h);.Если убрать матрицу mas, то ошибок не вылетает, это по идее должно значить, что память mas и mnew пересекается...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.08.2010, 21:06
Ответы с готовыми решениями:

Попытка чтения или записи в защищенную память
Здравствуйте, ошибка выходит на последней строке данного кода, я думаю ошибка именно здесь: adj = new int* ; for (i=0;i&lt;n+1;i++)...

Вылет программы: "Попытка чтения или записи в защищенную память"
Добрый день. при выполнении программы у меня часто вылетает с ошибкой: &quot;Попытка чтения или записи в защищенную память. Это часто...

Динамический массив: "Попытка чтения или записи в защищенную память"
Здравстувуйте. Пишу программу построения графиков. В целях оптимизации вынес функцию вывода отдельно от всех прочих вычислений. Вычисляю...

19
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
20.08.2010, 23:17
delete[] m; // <<< Вылетает тут
А чего удивительного? Конструктор по умолчанию не инициализирует указатель m. После чего ты вызываешь delete для мусорного указателя.

По коду по меньшей мере советую сделать :

1. Добавить везде проверку входных данных. На корректность width и height,к примеру.
2. Добавить конструктор по умолчанию с явным занулением указателя.
3. Добавить функцию очистки памяти, явно проверяющую,нулевой у тебя указатель или нет. Эту функцию потом и использовать в SetSize, очищая старую матрицу правильно.
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
20.08.2010, 23:36  [ТС]
C++
1
Matrix(int Width=1,int Height=1);
а это разве не конструктор по умолчанию ?

Не по теме:

как удалять сообщения

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2010, 00:37
KuKu, Это конструктор с параметрами по умолчанию. Констр по умолчанию -
C++
1
2
3
4
class T
{
   T(){/*Какой-то код или без кода. В данном случае видимо ptr=NULL*/}
};
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.08.2010, 00:44
Lavroff, если все параметры конструктора имеют значения по умолчанию, то такой конструктор является конструктором по умолчанию.

Не по теме:

Цитата Сообщение от KuKu Посмотреть сообщение

Не по теме:

как удалять сообщения

Никак, сообщение может удалить только администрация.

1
21.08.2010, 00:44

Не по теме:

CyBOSSeR, Спасибо. не знал

0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
21.08.2010, 00:48  [ТС]
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Конструктор по умолчанию не инициализирует указатель m.
вот тут не совсем понял,
C++
1
2
3
4
5
6
Matrix::Matrix(int Width,int Height)
{
    width=Width;
    height=Height;
    m=new int[width*height];
}
разве не инициальзация перменных
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2010, 00:50
KuKu, Выделение памяти под указатель.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.08.2010, 00:59
KuKu, вот сокращенный вариант вашего кода:
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
class Matrix {
private:
  int* m;
  int  width;
  int  height;
 
public:
  Matrix(int width = 1, int height = 1)
  : width (width)
  , height(height) {
    m = new int[width * height];
  }
 
  ~Matrix() {
    delete [] m;
  }
 
  void SetSize(int Width, int Height) {
    delete [] m;
 
    width  = Width;
    height = Height;
 
    m = new int[width * height];
  }
};
 
void foo() {
  Matrix m;
 
  m.SetSize(10, 10);
}
Все работает без проблем. Проверьте такой вариант функции.
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
21.08.2010, 01:11  [ТС]
ну по сути все так же ...
просто подобный код писал до этого несколько раз и сильно смущает что не работает
C++
1
2
3
4
5
6
7
8
9
10
11
    
           int w=bm->Width;
    int h=bm->Height;
    mas.SetSize(w,h);
    mnew.SetSize(15,15); // << тут работает 
    for(int i=0;i<w;i++)
            for(int j=0;j<h;j++)
            {
        mas(i,j)=(bm->GetPixel(i,j).R+bm->GetPixel(i,j).G+bm->GetPixel(i,j).B)/3;
            }
          mnew.SetSize(15,15); //а тут уже нет
Добавлено через 3 минуты
а еще вопрос... в этом коде где-нибудь тайно не могут вызываться конструкторы копирования или тому подобное ?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.08.2010, 01:20
Конструкторы копирования вызываются неявно при передаче объекта в функцию по значению и возврате объекта из функции.
Отладчиком пройтись пробовали?
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
21.08.2010, 01:32  [ТС]
пол дня пробую

Не по теме:

отладчик всмысле пошагово ?



Добавлено через 7 минут
а мб это важно ... вылетает с ассертом _BLOCK_TYPE_IS_VALID
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2010, 01:39
KuKu, Ошибка в выделении/очищении памяти.
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
21.08.2010, 01:45  [ТС]
это гуглил, видел примеры когда она вылетает ... обычно два раза удаляют или обращаются к удаленному(еще что то было с конструктором копирования, поэтому и спросил), у меня вродь этого нету

Добавлено через 2 минуты
больше интересует что имел ввиду XuTPbIu_MuHTAu в своем посте, дать массиву m конкретные значения или что
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2010, 01:47
KuKu, Или вообще не удаляют...
Ну например
C++
1
2
int*ptr;
ptr=NULL;
Впринципе вполне себе инициализация. Указывает вникуда, но хотя бы определен.
1
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
21.08.2010, 01:51  [ТС]
как понимаю зануление указателя это только некое удобство, а не необходимость... да к тому же хоть как не помогает
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
21.08.2010, 02:00
Цитата Сообщение от KuKu Посмотреть сообщение
да к тому же хоть как не помогает
помогает - ошибка обращение по NULL-адресу быстрее наводит на мысли
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
21.08.2010, 02:52  [ТС]
эм ... не понял почему, но
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e)
         {
            
            int w=22;
            int h=20;
            mas.SetSize(w,h);
            mnew.SetSize(w,h);
            for(int i=0;i<w;i++)
                for(int j=0;j<h;j++)
                {
                    mas(i,j)=10;
                }
            mnew.SetSize(15,15);                    
         }
когда переменные mas и mnew сделал глобальные, а не в кнопке, то все вроде заработало ... вроде

Добавлено через 42 минуты
только хз почему
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2010, 03:00
KuKu, У меня есть только одно предположение... Переменные выходят из области видимости и все... Но это как-то странно, если учитывать, что переменные не локальные ( то есть не создаются в этой функции ).
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
21.08.2010, 10:39  [ТС]
скорее всего у меня ошибка где то в классе, которая проявляется по праздникам, ну или можно потешить себя мыслями что во всем виновен компилятор
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.08.2010, 10:39
Помогаю со студенческими работами здесь

System.AccessViolationException: Попытка чтения или записи в защищенную память - попытка 3
Уже простите за некомпилируемый код, просто я переустановил Windows, и Visual Studio удалилась, только сегодня днем установил. Код там...

System.AccessViolationException: Попытка чтения или записи в защищенную память - попытка 2
В предыдущей теме некто вообразил, что код зацикливается, поэтому приходится выкладывать более широкую модель. Надеюсь, до целого проекта...

Попытка чтения или записи в защищенную память
Я зелёный в программировании, начал изучать не так давно, пишу курсовую и возникла у меня одна проблема - выбивает експепшн, мол я пытаюсь...

Попытка чтения или записи в защищенную память
Доброго времени суток, форумчане! Возникла такая проблема - при вызове функции из dll(написана на С++) в проекте C# компилятор...

Попытка чтения или записи в защищенную память
Здравствуйте. Вот такая проблема. При компиляции программы выводит сообщение: An unhandled exception of type...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных выбран регистр накопления, в. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru