Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458

Ошибка в нарушении прав доступа при выполнении деструктора

29.12.2016, 21:53. Показов 3410. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выдаёт ошибку(нарушение прав доступа)
Как это исправить?

Вот программа:
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
#include <iostream>//Конструктор копий
using namespace std;
class alpha
{
public:
//private:
    int data;
    int *p;
//public:
    alpha(){}
 
    alpha(int d){ p = new int [d]; data = d;     /*data = d;*/}
 
    alpha(alpha& a)
    {
        p = new int[a.data];
        p = a.p;
        data = a.data;
        cout<<"\n Запущен конструктор копирования";
    }
 
    void display()
    { cout<<data; }
 
    void operator = (alpha& a)
    {
        data = a.data;
        cout<<"\n Запущен оператор присваения";
    }
 
    ~alpha()
    {
        delete[]p;
    }
};
 
    void main()
    {
        setlocale( LC_ALL,"Russian" );
 
        alpha a1(1);
        a1.p[0]=20;
 
        alpha a2;
        a2 = a1; //запуск перегружаемого "="
        cout << "\na2="; a2.display();
 
        alpha a3(a1);//запуск конструктора копирования!
        cout << "\na3="; a3.display();
        cout << endl;
        system("pause");
}
И если есть какие нибудь замечания по поводу написанной программы буду рад их услышать исправите прогу.

В идеале я хотел использовать Конструктор копий для инициализации не массива а (единичной переменной), (элемента), (объекта), (аргумента), называйте как хотите.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2016, 21:53
Ответы с готовыми решениями:

Ошибка нарушения прав доступа при выполнении программы
Програмка компилируется, но не запускается. Ошибка: 1000 (0) handle_exceptions: Exception: STATUS_ACCESS_VIOLATION preo 1000 (0)...

Ошибка прав доступа при чтении
Нужно всего-то отсортировать двумерный динамический массив через шаблоны функций. Никаких классов и прочих штук с private i public нет. Но...

Ошибка: Нарушение прав доступа при чтении
Всем привет, решил в проект добавить функцию элементарную void MyClass::mouseMove() { LPPOINT cursorPos; for(;;) { ...

46
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 14:11  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nd2 Посмотреть сообщение
При глубоком копировании, нужно скопировать
данные, которые находятся по адресу из указателя. Для этого нужно выделить новую память и скопировать туда данные (в случае присваивания, перед этим нужно ещё освободить старую память).
Вот это то мне и не совсем ясно, то есть как реализовать это в коде
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.12.2016, 14:12
Цитата Сообщение от nd2 Посмотреть сообщение
MrGluck, начинающих не путай.
Если вы про то, что выделять память не всегда нужно - так я думал мы про конкретный пример говорим.

Добавлено через 24 секунды
Цитата Сообщение от Maxim09 Посмотреть сообщение
то есть как реализовать это в коде
У вас два примера готовых с этим.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.12.2016, 14:20
Лучший ответ Сообщение было отмечено Maxim09 как решение

Решение

Цитата Сообщение от MrGluck Посмотреть сообщение
Если вы про то, что выделять память не всегда нужно
Да, про это, чтобы ТС не запутался.

Добавлено через 4 минуты
Цитата Сообщение от Maxim09 Посмотреть сообщение
Вот это то мне и не совсем ясно, то есть как реализовать это в коде
Вот так и реализовать, как написано:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
A(const A& a) : N(a.N)
    {
        if (a.arr == nullptr)
            arr = nullptr;
        else
        {
            arr = new int[N]; // выделяем новую память размером, достаточным для копирования данных
            for (size_t i = 0; i < N; ++i) // копируем данные из памяти, 
                                            // адрес которой содержится в указателе объекта-параметра, 
                                            // в память, адрес которой содержится в указателе инициализируемого объекта
                arr[i] = a.arr[i];
        }
    }
1
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
30.12.2016, 14:20
Цитата Сообщение от nd2 Посмотреть сообщение
Maxim09, насчёт конструктора копирования (так же, как и насчёт оператора присваивания) нужно запомнить то, что есть два вида копирования (присваивания): поверхностное и глубокое. Поверхностное делает конструктор копирования (и оператор присваивания) по умолчанию: инициализирует поля создаваемого объекта (или объекта, которому присваивается) полями объекта, который передаётся в качестве параметра. В случае указателя, будет просто скопирован адрес из одного указателя в другой. При глубоком копировании, нужно скопировать
данные, которые находятся по адресу из указателя. Для этого нужно выделить новую память и скопировать туда данные (в случае присваивания, перед этим нужно ещё освободить старую память).
До боли знакомые слова)) кажется, я их видел в книге Праты?))
Но есть еще один способ, описываемый в книге Липпмана: можно при копировании или присваивании просто копировать указатель на ресурс в дин. памяти, но для этого нужно иметь в классе поле-счетчик ссылок на этот дин.объект. В таком случае можно использовать шаред_птр
0
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 14:31  [ТС]
nd2,
Скажите а в (строке 10) программы которую вы выложили, динамически выделяется память для конструктора с параметром так?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.12.2016, 14:36
Maxim09, память выделяется динамически там, где написан оператор new (либо его версия для массивов new[])
1
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 14:38  [ТС]
В таком случае зачем надо выделять динамически память в обычном конструкторе с параметром?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.12.2016, 14:39
Цитата Сообщение от Maxim09 Посмотреть сообщение
Скажите а в (строке 10) программы которую вы выложили, динамически выделяется память для конструктора с параметром так?
Здесь?
C++
1
A(size_t n) : N(n), arr(new int[N])
0
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 14:40  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Здесь?
Да.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.12.2016, 14:41
Цитата Сообщение от Maxim09 Посмотреть сообщение
В таком случае зачем надо выделять динамически память в обычном конструкторе с параметром?
Если в классе есть указатель, который предназначен для этого. Класс так задуман.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
30.12.2016, 14:42
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
можно при копировании или присваивании просто копировать указатель на ресурс в дин. памяти
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <memory>
 
template<typename Tp>
struct Array
{
  Array(int n) : data(new Tp[n], [](Tp const* data){delete [] data;}) {}
  // для такого примера и стандартного конструктора копирования достаточно
  Tp& operator[](const unsigned idx) { return *(data.get() + idx); }
  std::shared_ptr<Tp> data;
};
 
int main()
{
  Array<int> arr(221);
  auto arr2 = arr;
  arr2[0] = 123;
  std::cout << arr[0] << "\n";
}
Классно, теперь имеем два объекта с общим ресурсом.
0
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 14:43  [ТС]
То есть я имею в виду в чём его функциональная деятельность? Иными словами для чего?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.12.2016, 14:45
Тогда:
C++
1
A a(10); // будет выделена память в куче под 10 int, адрес начала которой будет храниться в указателе объекта
Добавлено через 57 секунд
Цитата Сообщение от Maxim09 Посмотреть сообщение
То есть я имею в виду в чём его функциональная деятельность? Иными словами для чего?
Его - это кого? Конструктора с параметрами? Конструктора копирования?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
30.12.2016, 14:45
Цитата Сообщение от GbaLog- Посмотреть сообщение
Классно, теперь имеем два объекта с общим ресурсом.
Кстати, именно поэтому и надо писать конструкторы копирования там, где есть динамическая память.
1
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 14:47  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Его - это кого?
Имел ввиду выделение динамической памяти в (строке 10).
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.12.2016, 14:49
Цитата Сообщение от Maxim09 Посмотреть сообщение
Имел ввиду выделение динамической памяти в (строке 10).
Вопрос сформулируй понятней.
0
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 14:52  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Вопрос сформулируй понятней.
Для чего там динамическое выделение памяти ведь операции с памятью требуются только конструкторе копирования.
там же по идее выделяется память для копирования.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.12.2016, 15:00
Цитата Сообщение от Maxim09 Посмотреть сообщение
Для чего там динамическое выделение памяти ведь операции с памятью требуются только конструкторе копирования.
Выделение памяти требуется там, где требуется.
Цитата Сообщение от nd2 Посмотреть сообщение
Класс так задуман.
Цитата Сообщение от nd2 Посмотреть сообщение
в классе есть указатель, который предназначен для этого.
0
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
30.12.2016, 15:05  [ТС]
Ясно вроде-бы. Спс

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
A(const A& a) : N(a.N)
    {
        if (a.arr == nullptr)
            arr = nullptr;
        else
        {
            arr = new int[N]; 
            for (size_t i = 0; i < N; ++i) 
                                            
                arr[i] = a.arr[i];
        }
    }
А что происходит в строках 3 и 4? Проверка чего? Осуществляется.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.12.2016, 15:33
Цитата Сообщение от Maxim09 Посмотреть сообщение
Проверка чего? Осуществляется.
Если память не выделялась, то и копировать из неё нечего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.12.2016, 15:33
Помогаю со студенческими работами здесь

Ошибка: нарушение прав доступа при чтении
Помогите решить ошибку, если отдельно вызывать функции double det(macierz *A,macierz*B,int u) void kramer(macierz A,macierz *B) ...

Ошибка при загрузке фото - нарушение прав доступа при чтении по адресу 0x00814000
При попытке компиляции кода выскакивает ошибка: Первый этап обработки исключения по адресу 0x5E4FF20C (msvcr120.dll) в TestSFML.exe:...

Ошибка нарушения прав доступа при чтении по адресу, возникающая при инициализации трехмерного массива
Очень нужна ваша помощь! Я уже не знаю что тут можно сделать. Код части программы, где вылазит ошибка ниже. Коротко о проблеме: я...

Ошибка: нарушение прав доступа при чтении по адресу
Код: #include &lt;SFML/Graphics.hpp&gt; int M = 3; int N = 3; int Scale = 100; int w = Scale*M; int h = Scale*N;

Ошибка времени исполнения: нарушение прав доступа при чтении
Как исправить. В функции decode вторая строка. Необработанное исключение по адресу 0x00FD6A4F в kurs.exe: 0xC0000005: нарушение прав...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru