Форум программистов, компьютерный форум, киберфорум С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68

При вызове деструктора в строке delete[] data выбрасывается исключение

13.12.2019, 20:32. Показов 3659. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
вот как раз вопрос по этой теме. программа отрабатывает все команды и в конце при вызове деструктора в строке delete[] data выбрасывает исключение. Где искать? Что делать? maxsize делала и в классе и вне класса статической переменной, ничего не помогает.

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Set(int n) {
        cout << "вызвался конструктор Set с параметром" << endl;
        maxsize = n;
        data = new char[maxsize];//выделить динамическую память для массива элементов
        cursize = 0;
    }
    Set(const Set& ob) {
        cout << "вызвался конструктор копирования Set" << endl;       
        data = new char[maxsize];
        for (int i = 0; i < cursize; i++)
            data[i] = ob.data[i];
    }
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2019, 20:32
Ответы с готовыми решениями:

Ошибка при вызове деструктора (при вызове delete в деструкторе)
Не могу найти ошибку, при вызове деструктора от класса, который был создан при помощи конструктора с параметром const String &amp;,...

Выбрасывается исключение при вызове функций из библиотеки glut
Здраствуйте //почемуто возникает exeption тогда когда вызываются функции из библиотеки glut!!! Они мне очень нужны так как позволяють ...

Выбрасывается исключение при создании класса
Как объявить класс и поля с методами и функциями в нем?? Пытался сделать так но выводит исключение program Project1; uses crt; ...

15
 Аватар для zayats80888
6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
13.12.2019, 21:07
Увидеть бы выражение, в котором выбрасывается исключение, а по этому обрывку можно сказать, что не хватает конструктора по умолчанию и оператора присваивания
0
Нарушитель
9831 / 5364 / 1222
Регистрация: 12.03.2015
Сообщений: 25,123
13.12.2019, 21:08
покаж весь класс, не стесняйся.
0
 Аватар для zayats80888
6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
13.12.2019, 21:08
Также в конструкторе копирования почему то не копируются maxsize и cursize
1
11 / 10 / 7
Регистрация: 07.05.2013
Сообщений: 248
13.12.2019, 21:18
я думаю тут cursize и maxsize поля класса
да и к тому же maxsize присваивается значение входного параметра n

Добавлено через 2 минуты
если я правильно помню, сначала надо очистить элементы (пройтись по всем и вызвать у каждого delete), а затем выполнить удаление непосредственно у переменной

ну т.е что-то вроде:
C++ Скопировано
1
2
3
4
5
6
for (int i = 0; i < maxsize; ++i)
{
delete data[i];
}
 
delete [] data;
0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 16:05  [ТС]
весь код: делаю класс, конструктор копирования есть.

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
static int maxsize = 0;
class Set {
private:
    char* data;    
    int   cursize;
public:
    Set() {
        cout << "вызвался конструктор Set" << endl;
    };
    Set(int n, char*D) {
        cout << "вызвался конструктор Set с параметром" << endl;
        maxsize = n;
        data = new char[maxsize];//выделить динамическую память для массива элементов
        data = new char[maxsize]; // под массив выделяется память - нужен деструктор для ее удаления
        for (int i(0); i < maxsize; i++)
        {
            data[i] = D[i];
        }
        cursize = 0;
    }
    Set(const Set& ob) {
        cout << "вызвался конструктор копирования Set" << endl;       
        data = new char[maxsize];
        for (int i = 0; i < cursize; i++)
            data[i] = ob.data[i];
    }
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
 
    // перегрузить оператор присваивания
    Set& operator =(Set& b) {
        // Выполнить копирование значений      
        cursize = b.cursize;
        data = b.data;
        // Возвратить текущий объект, чтобы иметь возможность связать в цепочку выполнение нескольких операций присваивания
        return *this;
 
    };
 
    //вставить по принципу дерева
    //(упорядоченная вставка при помощи двоичного поиска)
    Set& operator + (const char c) {
        if (cursize >= maxsize)
            return *this;
        else if (!cursize || (c > data[cursize - 1])) {
            data[cursize++] = c;
            return *this;
        }
        int m, f = 0, l = cursize;
        while (f < l) {
            m = f + (l - f) / 2;
            if (c == data[m])
                return *this;
            else if (c < data[m])
                l = m;
            else
                f = m + 1;
        }
 
        for (int i = cursize; i > f; --i)
            data[i] = data[i - 1];
 
        data[f] = c;
        ++cursize;
        return *this;
    }
 
    //
    Set& operator - (const char d) {
        unsigned int number, i, j;
        for (i = 0; i < cursize; i++)
        {
            if (d == data[i])
            {
                for (j = i; j < cursize - 1; j++)
                    data[j] = data[j + 1];
                cursize--;
            }
 
        }
        return *this;
 
    };
    // перегрузить оператор равенства
    bool operator == (const Set &c) {
        if (this->cursize != c.cursize)
        {
            cout << "размеры неравны!" << endl;
            return false;
        }
        cout << "размеры равны!" << endl;
 
        for (int i = 0; i < c.cursize; i++)
        {
            if (this->data[i] != c.data[i])
            {
                cout << "но значения не неравны!" << endl;
                return false;
            }
            else
                cout << "значения равны!" << endl;
 
        }
        return true;
    };
 
    // перегрузить оператор неравенства
    bool operator != (const Set &c) {
        if (this->cursize != c.cursize)
 
        {
            cout << "размеры неравны!" << endl;
            return true;
        }
        cout << "размеры равны!" << endl;
        for (int i = 0; i < c.cursize; i++)
        {
            if (this->data[i] != c.data[i])
            {
                cout << "значения  не равны!" << endl;
                return true;
            }
            else
                cout << "значения равны!" << endl;
        }
        return false;
    };
 
    // перегрузить оператор проверки на подмножество
    bool operator > (const Set &b) {
        if (b.cursize > this->cursize)
        {
            cout << "размеры некоректны для проверки условия!" << endl;
            return false;
        }
        //cout << "размеры сопоставимы!" << endl;
        for (int i = 0; i < b.cursize; i++) // идем по элементам b
        {
            bool notfound = true; // считаем пока , что b[i] нет
            for (int j = 0; j < this->cursize; j++) // сравниваем со всеми a[j] по очереди
            {
                if (b.data[i] == this->data[j]) // нашли
                {
                    cout << b.data[i] << " == " << this->data[j] << " этот элемент состоит в множестве!" << endl;
                    notfound = false;
                    break;
                }
            }
            if (notfound)
 
                //cout << "не является!" << endl;
                return false;
            // если не нашли возвращаем false
        }
        return true; // все найдены
    };
 
    //ввести элемент множества с клавиатуры
    Set& Input() {
        char c;
        cout << "введи новый символ в множество Дерево" << endl;
        cin >> c;
        if (cursize >= maxsize)
            return *this;
        else if (!cursize || (c > data[cursize - 1])) {
            data[cursize++] = c;
            return *this;
        }
 
        int m, f = 0, l = cursize;
        while (f < l) {
            m = f + (l - f) / 2;
            if (c == data[m])
                return *this;
            else if (c < data[m])
                l = m;
            else
                f = m + 1;
        }
 
        for (int i = cursize; i > f; --i)
            data[i] = data[i - 1];
 
        data[f] = c;
        ++cursize;
    };
 
    // удалить элемент множества
    void extract()
    {
        unsigned int number, n, i, j;
        n = cursize;
        std::cout << "Введите номер элемента от 0 до " << cursize - 1 << std::endl;
        std::cin >> number;
 
        if (number < 0 || number > cursize)
            std::cout << "Ошибка " << std::endl;
        else
        {
            for (i = 0; i < n; i++)
            {
                if (i == number)
                {
                    for (j = i; j < n - 1; j++)
                        data[j] = data[j + 1];
                    n--;
                }
 
            }
            cursize--;
        }
    };
 
    //вывести все элементы множества на экран
    void Print(void) {
        cout << "размер множества = " << cursize << " элементов" << endl;
        cout << "множество состоит из  " << endl;
        for (int i = 0; i < cursize; ++i)
            cout << data[i] << ' ';
        cout << endl;
    };
 
};
Добавлено через 4 минуты
а если пытаюсь удалять поэлементно - не дает, подчеркивает data красным

C++ Скопировано
1
2
3
4
5
6
for (int i = 0; i < maxsize; ++i)
{
delete data[i];
}
 
delete [] data;
0
 Аватар для zayats80888
6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
14.12.2019, 17:18
NNNNNNNNN,
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
class Set {
private:
    static const int maxsize = 100; //<-- какую роль это играет в вашем коде я не понял, поэтому сделал так
    int cursize;
    char* data;
public:
 
    Set():cursize(0), data(nullptr)
    {
        cout << "вызвался конструктор Set" << endl;
    }
 
    Set(int n, char*D):cursize(n), data(new char[n])
    {
        cout << "вызвался конструктор Set с параметром" << endl;
        for (int i(0); i < cursize; i++)
        {
            data[i] = D[i];
        }
    }
 
    Set(const Set& ob):Set(ob.cursize, ob.data)
    {
        cout << "вызвался конструктор копирования Set" << endl;
    }
 
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
 
    // перегрузить оператор присваивания
    Set& operator =(const Set& b) {
        // Выполнить копирование значений
        if (this != &b)
        {
            delete[] data;
            cursize = b.cursize;
            data = new char[cursize];
            for (int i(0); i < cursize; i++)
            {
                data[i] = b.data[i];
            }
        }       
        // Возвратить текущий объект, чтобы иметь возможность связать в цепочку выполнение нескольких операций присваивания
        return *this;
    }
// ...
// в остальное не вникал
// ...
};
0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 20:06  [ТС]
исключение на строчку data[i] = D[i];
Миниатюры
При вызове деструктора в строке delete[] data выбрасывается исключение  
0
 Аватар для zayats80888
6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
14.12.2019, 20:13
Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
исключение на строчку data[i] = D[i];
покажи 16 строку функции main

Добавлено через 5 минут
Хотя лучше всю функцию main(только выдели комментарием строку, которая в твоем проекте №16)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12873 / 6737 / 1810
Регистрация: 18.10.2014
Сообщений: 17,055
14.12.2019, 20:40
Лучший ответ Сообщение было отмечено Kuzia domovenok как решение

Решение

Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
конструктор копирования есть.
Конструктор копирования есть, но в нем написана чушь. Оператор присваивания есть, но в нем написана чушь... Дальше можно не смотреть.

Вам уже показали пальцем на чушь в конструкторе копирования. Зачес вы снова приводите этот код?

Добавлено через 2 минуты
Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
C++ Скопировано
1
2
3
4
5
а если пытаюсь удалять поэлементно - не дает, подчеркивает data красным
for (int i = 0; i < maxsize; ++i)
{
delete data[i];
}
Что такое "удалять поэлементно"?
0
14.12.2019, 20:47

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что такое "удалять поэлементно"?
скорее всего это попытка последовать совету из непонятно к чему относящемуся поста №5

0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 21:33  [ТС]
вот весь main
работает, пока закоментировано //delete[] data; в деструкторе
(при php.h которое в начале этой темы)

int Max_size = 20;//

int main() {
setlocale(LC_ALL, "ru");
std::cout << "Hello World!\n";
char *d=nullptr;

Set a = Set(Max_size, d);
a = a + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w';
a = a - 'M';
a = a - 'k';
a.Print();

Set b = Set(Max_size, d);
b = b + 'a' + 't' + 'e' + 'm' + 'i';
b.Print();

Set c = Set(Max_size, d);
c = c + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w' + 'r';
c.Print();
c.extract();
c.Print();

if (a == b) cout << "yes, a = b" << endl;
else cout << "a != b" << endl;
if (a == c) cout << "yes, a = c" << endl;
else cout << "a != c" << endl;

if (a != b) cout << "yes, a != b" << endl;
else cout << "a == b" << endl;
if (a != c) cout << "yes, a != c" << endl;
else cout << "a == c" << endl;

Set Q = Set(Max_size, d);
Set q2 = Set(Max_size, d);
Q = Q + 'A' + 'B' + 'O' + 'R' + 'A' + 'B' + 'W' + 'I';
Q.Print();

Set q = Set(Max_size, d);
q = q + 'O' + 'A' + 'R' + 'I' + 'W';
q.Print();
q2 = Q;
q2.Print();

if (Q > q)
cout << "подмножество q принадлежит Q" << endl;
else
cout << "НЕТ! подмножество q не принадлежит Q" << endl;
Q.extract();
Q.Print();
if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
else cout << "НЕТ! подмножество q не принадлежит Q" << endl;
Q.extract();

Q.Print();
q.Print();

if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
else cout << "НЕТ! подмножество q не принадлежит Q!" << endl;
return 0;

}

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

да, "это попытка последовать совету из поста №5"
0
 Аватар для zayats80888
6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
14.12.2019, 21:44
Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
Set a = Set(Max_size, d);
ну ясен пень, в чем смысл такого вызова?
Set a;



Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
char *d=nullptr;
удалить

Добавлено через 6 минут
Смысл maxsize я понял, только зачем тут динамический массив? Можно статическим обойтись
0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 21:51  [ТС]
а конструктор? туда что вставлять вместо char *D?
C++ Скопировано
1
2
3
4
5
6
7
8
 Set(int n, char*D):cursize(n), data(new char[n])
    {
        cout << "вызвался конструктор Set с параметром" << endl;
        for (int i(0); i < cursize; i++)
        {
            data[i] = D[i];
        }
    }
0
 Аватар для zayats80888
6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
14.12.2019, 21:53
Лучший ответ Сообщение было отмечено NNNNNNNNN как решение

Решение

исправил конструкторы под вашу задачу
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
class Set {
private:
    static const int maxsize = 20;
    int cursize;
    char* data;
public:
 
    Set() :cursize(0), data(new char[maxsize])
    {
        cout << "вызвался конструктор Set" << endl;
    }
 
    Set(int n, char* D) :cursize(n), data(new char[maxsize])
    {
        cout << "вызвался конструктор Set с параметром" << endl;
        for (int i(0); i < cursize; i++)
        {
            data[i] = D[i];
        }
    }
 
    Set(const Set& ob) :Set(ob.cursize, ob.data)
    {
        cout << "вызвался конструктор копирования Set" << endl;
    }
 
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
 
    // перегрузить оператор присваивания
    Set& operator =(const Set& b) {
        // Выполнить копирование значений
        if (this != &b)
        {
            cursize = b.cursize;
            for (int i(0); i < cursize; i++)
            {
                data[i] = b.data[i];
            }
        }
        // Возвратить текущий объект, чтобы иметь возможность связать в цепочку выполнение нескольких операций присваивания
        return *this;
    }
    // ...
    // в остальное не вникал
    // ...
и функцию main()
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
int main() {
    setlocale(LC_ALL, "ru");
    std::cout << "Hello World!\n";
 
    Set a;
    a = a + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w';
    a = a - 'M';
    a = a - 'k';
    a.Print();
 
    Set b;
    b = b + 'a' + 't' + 'e' + 'm' + 'i';
    b.Print();
 
    Set c;
    c = c + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w' + 'r';
    c.Print();
    c.extract();
    c.Print();
 
    if (a == b) cout << "yes, a = b" << endl;
    else cout << "a != b" << endl;
    if (a == c) cout << "yes, a = c" << endl;
    else cout << "a != c" << endl;
 
    if (a != b) cout << "yes, a != b" << endl;
    else cout << "a == b" << endl;
    if (a != c) cout << "yes, a != c" << endl;
    else cout << "a == c" << endl;
 
    Set Q;
    Set q2;
    Q = Q + 'A' + 'B' + 'O' + 'R' + 'A' + 'B' + 'W' + 'I';
    Q.Print();
 
    Set q;
    q = q + 'O' + 'A' + 'R' + 'I' + 'W';
    q.Print();
    q2 = Q;
    q2.Print();
 
    if (Q > q)
        cout << "подмножество q принадлежит Q" << endl;
    else
        cout << "НЕТ! подмножество q не принадлежит Q" << endl;
    Q.extract();
    Q.Print();
    if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
    else cout << "НЕТ! подмножество q не принадлежит Q" << endl;
    Q.extract();
 
    Q.Print();
    q.Print();
 
    if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
    else cout << "НЕТ! подмножество q не принадлежит Q!" << endl;
    return 0;
 
}
1
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 23:05  [ТС]
) смысл? задание - сделать массив динамическим. преподаватель так придумал.

Добавлено через 23 минуты
спасибо! теперь работает, пытаюсь понять где была проблема - можете намекнуть? если есть время, конечно. Но спасибо в любом случае!

Добавлено через 46 минут
стала искать определение двоеточия
оно имеет название? где про это прочитать?
это оно, нет? понять дико сложно, конечно...

Stack overflow-
"Область кода за двоеточием и до начала тела конструктора называется инициализатором конструктора.

Используется как для инициализации членов класса, так и для вызова конструктора базового/базовых классов, т.е. по сути, инициализации базовой составляющей. Также здесь может быть вызов другого конструктора текущего класса (делегирование конструкторов, начиная с c++11)."
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2019, 23:05
Помогаю со студенческими работами здесь

Выбрасывается исключение при попытке подключения к БД
При запуске кода выдает исключение, classpath настроил. Не знаю, что делать. В чем может быть проблема? import java.sql.*; import...

Выбрасывается исключение при выводе элементов массива
В строке пишется последовательность чисел через пробел. Программа считает кол-во чисел и выводит его в другое поле: procedure...

Выбрасывается исключение при вводе названия фирмы
Добрый день! В моей программе неправильно работает ввод названия фирмы, и я не совсем понимаю,как мне потом выводить данные,если их будет...

Исключение повторно выбрасывается при завершении события DragDrop
Здравствуйте! Никак не могу решить одну проблему. Перетаскиваю файлы в pictureBox1 с рабочего стола, диска, и т.д. и отлавливаю...

Ошибка при вызове деструктора
Не могу дописать лабу... Надо создать 4 класса, описать поля и методы. Выкладываю исходники: Самый главный класс - Order. Выбивает ошибку в...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточность в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер