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

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

29.12.2016, 21:53. Показов 3565. Ответов 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
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.12.2016, 14:12
Цитата Сообщение от nd2 Посмотреть сообщение
MrGluck, начинающих не путай.
Если вы про то, что выделять память не всегда нужно - так я думал мы про конкретный пример говорим.

Добавлено через 24 секунды
Цитата Сообщение от Maxim09 Посмотреть сообщение
то есть как реализовать это в коде
У вас два примера готовых с этим.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
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
8217 / 5048 / 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,430
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,430
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,430
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,430
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,430
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,430
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
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru