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

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

29.12.2016, 21:53. Показов 3281. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru