Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

Ошибки при удалении динамических массивов

22.09.2014, 07:32. Показов 8221. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
компилируется все нормально, но при вызове delete[] к абсолютно валидным указателям почему то вылетает "HEAP CORRUPTION DETECTED"

town.h
Кликните здесь для просмотра всего текста
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
#include <Windows.h>
#include <conio.h>
#include <iostream>
#include <fstream>
 
using namespace std;
 
class town //класс населенный пункт
{
private:
    char* name; //название
    double latitude; //широта
    double longitude; //долгота
    char* transport; //виды общественного транспорта
 
    inline char* getname() { return name; }
public:
    //конструктор без параметров
    town();
    //конструктор с параметром задающим название
    town(char* _name);
    //конструктор с параметрами задающими все поля
    town(char* _name, size_t _population, double _latitude, double _longitude, char* _transport);
    //деструктор
    ~town();
    //метод Input выполняет ввод данных из файла
    bool Input();
    //метод Output печатает на экране данные класса
    bool Output();
protected:
    size_t population; //количество жителей
 
    inline size_t getpopulation() { return population; }
};
 
//Функция чистит консоль
bool ClearConsole();
//Функция печатает надпись (флаг inscription), возвращает код нажатой клавиши и, если надо, чистит консоль (флаг cls)
char pause(bool cls = false, bool inscription = true);
//Функция читает введенную строку из переданного потока в динамически выделяемый буфер
char* GetString(istream& stream);

town.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
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
#include "town.h"
 
town::town()
{
    name = new char;
    *name = 0;
    population = 0;
    latitude = 0.0;
    longitude = 0.0;
    transport = new char;
    *transport = 0;
}
 
town::town(char* _name)
{
    name = new char[strlen(_name)];
    strcpy(name, _name);
    population = 0;
    latitude = 0.0;
    longitude = 0.0;
    transport = new char;
    *transport = 0;
}
 
town::town(char* _name, size_t _population, double _latitude, double _longitude, char* _transport)
{
    name = new char[strlen(_name)];
    strcpy(name, _name);
    population = _population;
    latitude = _latitude;
    longitude = _longitude;
    transport = new char[strlen(_transport)];
    strcpy(transport, _transport);
}
 
town::~town()
{
    if (name) delete[] name;
    population = 0;
    latitude = 0.0;
    longitude = 0.0;
    if (transport) delete[] transport;
}
 
bool town::Input()
{
    char *filename; //имя файла
    char *tmp, *str;
    cout << "filename: "; //запрос имени файла
    filename = GetString(cin);
    tmp = new char[strlen("input\\") + strlen(filename)];
    strcpy(tmp, "input\\");
    strcat(tmp, filename); //добавление папки в которой лежит файл
    ifstream stream(tmp); //открытие потока
    if (!stream.is_open()) return false; //если поток не открылся выход
    delete[] filename;
    delete[] tmp;
 
    //читаю название
    str = GetString(stream);
    sscanf(str, "name=%s", name);
    delete[] str;
 
    //читаю население
    str = GetString(stream);
    sscanf(str, "population=%d", &population);
    delete[] str;
 
    //читаю широту
    str = GetString(stream);
    sscanf(str, "latitude=%lf", &latitude);
    delete[] str;
 
    //читаю долготу
    str = GetString(stream);
    sscanf(str, "longitude=%lf", &longitude);
    delete[] str;
 
    //читаю виды транспорта
    str = GetString(stream);
    sscanf(str, "transport=%s", transport);
    delete[] str;
 
    return true;
}
 
bool town::Output()
{
    cout << "name="       << name       << endl
         << "population=" << population << endl
         << "latitude="   << latitude   << endl
         << "longitude="  << longitude  << endl
         << "transport="  << transport  << endl << endl;
    return true;
}
 
bool ClearConsole()
{
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD written;
    COORD zeroPos = { 0, 0 };
 
    if (GetConsoleScreenBufferInfo(consoleHandle, &csbi))
    {
        DWORD numChars = csbi.dwSize.X * csbi.dwSize.Y;
 
        FillConsoleOutputCharacter(consoleHandle, ' ', numChars, zeroPos, &written);
        FillConsoleOutputAttribute(consoleHandle, csbi.wAttributes, numChars, zeroPos, &written);
    }
    SetConsoleCursorPosition(consoleHandle, zeroPos);
    return consoleHandle;
}
 
char pause(bool cls, bool inscription)
{
    if (inscription) cout << "Для продолжения нажмите любую клавишу . . . ";
    char key = getch();  //cin.get();
    if (cls) ClearConsole();
    return key;
}
 
char* GetString(istream& stream)
{
    char* str = new char;
    size_t length = 1;
    while ((stream.get(str[length - 1])) && (str[length - 1] != '\n'))
    {
        char* tmp = new char[length];
        memcpy(tmp, str, length);
        delete[] str;
        str = new char[length + 1];
        memcpy(str, tmp, length++);
        delete[] tmp;
    }
    str[length - 1] = 0;
    return str;
}

main.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
#include "town.h"
 
int main()
{
    setlocale(LC_ALL, "RUSSIAN");
 
    //использование конструктора по умолчанию
    town a;
    cout << "использование конструктора по умолчанию" << endl << endl;
    a.Output();
    pause(true);
 
    //использование конструктора с параметром задающим название
    town b("Пенза");
    cout << "использование конструктора с параметром задающим название" << endl << endl;
    b.Output();
    pause(true);
 
    //использование конструктора с параметрами задающими все поля
    char* transport = "автобусы, тролейбусы";
    cout << "использование конструктора с параметрами задающими все поля" << endl << endl;
    town c("Пенза", 517311, 53.19, 45.00, transport);
    c.Output();
    pause(true);
 
    //использование массива экземпляров класса с заполнением из файла
    const size_t size = 3;
    town* d = new town[size];
    for (int i = 0; i < size; i++)
    {
        cout << "использование массива экземпляров класса с заполнением из файла" << endl << endl;
        d[i].Input();
        cout << endl;
        d[i].Output();
        pause(true);
    }
    delete[] d;
 
    return cin.get();
}


ошибки в town.cpp строки: 38, 42, 57
ошибки в main.cpp строки: 37 (тут немного по другому пишет: "lab2.exe вызвал срабатывание точки останова.")
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2014, 07:32
Ответы с готовыми решениями:

Инициализация динамических массивов при создании
как создавать динамические массивы,чтоб вводить данные с клавиатуры знаю.. примерно это выглядит так: float *P; //обьявление...

Ошибки при умножении динамических матриц
В строке ввода в вызывающее окружение матрицы выдает ошибку : &quot;Вызвано исключение по адресу 0x00E228A0 в MultiplicationMatrix.exe:...

Создание динамических массивов внутри класса: Нарушение прав доступа при чтении "0xbf800000"
столкнулся с непонятной для меня бедой. Если код написать внутри главной функции то всё работает. Но если попытаться перенести работу в...

20
9 / 10 / 2
Регистрация: 18.06.2013
Сообщений: 119
22.09.2014, 07:43
у тебя указатели не имеют начального адреса, поэтому и вылетает)))
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 08:21  [ТС]
Цитата Сообщение от Cryptoff Посмотреть сообщение
у тебя указатели не имеют начального адреса, поэтому и вылетает)))
все они имеют, читай код внимательнее...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.09.2014, 08:53
5, 10, 21-я строки выделяешь не массив.
16, 27 и т.д. - нет места для завершающего нуля.
Дальше не смотрел.
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 09:22  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
5, 10, 21-я строки выделяешь не массив.
в этом плане никакой разницы как выделять нет... т.е. нет разницы между new char и new char[1], т.к. одинаково выделяется память на размер типа...
Цитата Сообщение от castaway Посмотреть сообщение
16, 27 и т.д. - нет места для завершающего нуля.
а вот здесь попал в самую точку, каюсь не заметил, спасибо поправил, теперь деструктор работает нормально, осталось решить проблему с удалением tmp (town.cpp : 57 строка) и массива объектов класса (main.cpp : 37 строка)

Добавлено через 6 минут
аа все с удалением tmp была та же история... не хватало места под завершающий нуль, так теперь остается только вопрос с удалением массива объектов класса
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
22.09.2014, 09:30
GetHelp, если выделяешь память new без скобок, то и удалить нужно delete без скобок. Это стандарт. Компилятор может выделять память под new и new[] совершенно по-разному.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 09:31  [ТС]
Цитата Сообщение от mporro Посмотреть сообщение
GetHelp, если выделяешь память new без скобок, то и удалить нужно delete без скобок. Это стандарт. Компилятор может выделять память под new и new[] совершенно по-разному.
нет, совсем не обязательно, у меня все нормально удаляет, ошибки были из за нехватки места под нуль, все это уже проехали сейчас все нормально с этим...
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
22.09.2014, 10:18
GetHelp, конечно, совсем не обязательно...
Это самые страшные ошибки С++. Неопределённое поведение.
1
8 / 8 / 3
Регистрация: 30.04.2013
Сообщений: 25
22.09.2014, 10:42
Цитата Сообщение от mporro Посмотреть сообщение
если выделяешь память new без скобок, то и удалить нужно delete без скобок. Это стандарт
Цитата Сообщение от GetHelp Посмотреть сообщение
нет, совсем не обязательно

Не по теме:

Отрицаешь стандарт? Апасный!


GetHelp, вы вообще в курсе что существует документ, в котором описано как и что работает в языке? Этот документ носит название "Standard for Programming Language C++".

Так вот, в C++ есть операторы new, new[], delete и delete[]. И предполагается что они работаю попарно. new с delete, а new[] с delete[]. Также, предполагается что программист не идиот и будет работать с инструментами, данными ему ,так как с ними нужно работать, а не как ему хочется. Андестенд?

P.S. За инструкциями к использованию можно обратиться хотя бы к одной из десятков существующих книг о C++.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 10:56  [ТС]
somebdy, давайте закроем тему про это? меня никто не переубедит я упертый !!! меня сейчас больше интересует ошибка удаления массива экземпляров класса и она к этому уже отношения не имеет...
0
22.09.2014, 11:05

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
меня никто не переубедит я упертый
ага, мы уже заметили..

0
22.09.2014, 11:40

Не по теме:

Надеюсь, ТС никогда не будет работать программистом...

0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 12:40  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
Надеюсь, ТС никогда не будет работать программистом...
давайте обойдемся без ваших надежд а то я много чего могу вам пожелать только цензура не пропустит... программист моя основная профа будет и чхал я на ваши стандарты

Добавлено через 3 минуты
и нечего вообще оффтопить в моей теме, еще и модер называется
 Комментарий модератора 
Нарушение правил п.3.1 Уважительно относитесь к другим участникам форума.
Пока усное предупреждение. И от себя добавлю даже если вы станете прекрасным программистом не каждая контора согласиться иметь с вами дело если вы не научитесь сдерживать свои эмоции.
0
8 / 8 / 3
Регистрация: 30.04.2013
Сообщений: 25
22.09.2014, 16:24
Лучший ответ Сообщение было отмечено GetHelp как решение

Решение

GetHelp, ну смотри.

Есть у нас такая штука
C++
1
T * ptr = new T;
Что здесь делает new? Находит место в памяти под один объект типа T, выделяет память в необходимом кол-ве, вызывает конструктор по умолчанию и возвращает указатель на участок памяти в котором находится наш объект типа T. Так? Так.
C++
1
delete ptr;
Что делает delete? Вызывает деструктор одного объекта на который указывает ptr и освобождает память. Так? Так.
C++
1
T * ptr = new T[n];
Что делает new[]? Находит место в памяти под n объектов типа T, выделяет память под n объектов типа T, для каждого объекта вызывает конструктор по умолчанию и возвращает указатель на первый объект типа T. Так? Так.
C++
1
delete[] ptr;
Что делает delete[]? Вызывает деструктор для кажд.. погоди ка, а откуда delete[] знает что нужно вызвать деструкторы для нескольких объектов? А оттуда что он delete[], а не delete. А еще delete[] знает сколько деструкторов вызвать, и какое кол-во памяти освободить. А это, в свою очередь, говорит о том что new[] как то сообщает delete[], чего и сколько освобождать. Но вот чего delete[] не знает, так это того, как себя вести, если его попросят освободить память выделенную при помощи new, который общается с delete, но не с delete[]. По этому он будет вести себя как обычно, т.е пытаться освобождать память выделенную под несколько элементов, что в свою очередь ведет к неопределённому поведению. Тоже самое касается и освобождения памяти, выделенной new[], при помощи delete.

Верить или не верить это конечно дело твоё, но если ты обращаешься за помощью на форум, то, наверное, нужно хоть немножко обращать внимание на то, что тебе советуют.

По коду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
town::town()
{
    name = new char; // выделили память под один символ
    *name = 0;
    ...
    transport = new char; // выделили память под один символ
    *transport = 0;
}
 
town::town(char* _name)
{
    ...
    transport = new char; // выделили память под один символ
    *transport = 0;
}
 
town::~town()
{
    if (name) delete[] name; // освобождаем память как будто name это массив
    ...
    if (transport) delete[] transport; // освобождаем память как будто transport это массив
}
Если объект типа town был инициализирован конструктором town() или town(char*), то в деструкторе возникает неопределенное поведение.

Решается очень просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
town::town()
{
    name = 0; // нет имени, нулевой указатель
    ...
    transport = 0; // нет транспорта, нулевой указатель
}
 
town::town(char* _name)
{
    ...
    transport = 0; // нет транспорта, нулевой указатель
}
 
town::~town()
{
    delete[] name; // освобождаем память
    ...
    delete[] transport; // освобождаем память
}
В конструкторах заменили инициализацию указателей адресами нулевых символов на инициализацию нулями, что позволяет избавиться от условий в деструкторе, т.к попытка освободить память по нулевому указателю проходит успешно и без последствий.

Далее:
C++
1
2
3
4
5
6
7
8
9
10
11
bool town::Input()
{
    char *filename;
    char *tmp, *str;
    ... // выделение памяти под имя файла и путь
    ifstream stream(tmp);
    if (!stream.is_open()) return false;
    delete[] filename;
    delete[] tmp;
    ...
}
Если поток ввода не открылся, то функция завершает своё выполнение и оставляет выделенной память под имя файла и путь. Утечка.

Решение:
C++
1
2
3
4
5
6
7
8
bool town::Input()
{
    ...
    delete[] filename;
    delete[] tmp;
    if (!stream.is_open()) return false;
    ...
}
Переместить условие завершения функции.

И здесь же:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool town::Input()
{
    ...
    //читаю название
    str = GetString(stream);
    sscanf(str, "name=%s", name);
    delete[] str;
    ...
    //читаю виды транспорта
    str = GetString(stream);
    sscanf(str, "transport=%s", transport);
    delete[] str;
 
    return true;
}
Функция sscanf ведь не выделяет память под новый контент, она пытается записать его по переданным адресам.
Но если объект типа town был инициализирован конструктором town() или town(char*), то в вашем варианте name и transport это указатели на один символ, в моем нулевые указатели. Что делать? Выделять память в нужном количестве.

Как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool town::Input()
{
    ...
    //читаю название
    str = GetString(stream);
    if (name)
        delete[] name;
    name = new char[strlen(str) - strlen("name=") + 1];
    sscanf(str, "name=%s", name);
    delete[] str;
    ...
    //читаю виды транспорта
    str = GetString(stream);
    if (transport)
        delete[] transport;
    transport = new char[strlen(str) - strlen("transport=") + 1];
    sscanf(str, "transport=%s", transport);
    delete[] str;
 
    return true;
}
Зачем освобождать память выделенную под имя и транспорт? Что бы не было утечек.

Если в town() и town(char *) инициализировать name и transport нулями то при выводе вылезут нули.
Исправим:
C++
1
2
3
4
5
6
7
8
9
bool town::Output()
{
    cout << "name="       << (name ? name : "") << endl;
         << "population=" << population         << endl
         << "latitude="   << latitude           << endl
         << "longitude="  << longitude          << endl
         << "transport="  << (transport ? transport : "") << endl << endl;
    return true;
}
Ну и на последок. GetString можно чуток сократить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char* GetString(istream& stream)
{
    char* str = new char;
    size_t length = 1;
    while ((stream.get(str[length - 1])) && (str[length - 1] != '\n'))
    {
        char* tmp = new char[length + 1];
        memcpy(tmp, str, length++);
        delete[] str;
        str = tmp;
    }
    str[length - 1] = 0;
    return str;
}
Вроде все. Что узрел, то узрел.

Не по теме:

Портянка хороошая вышла, длииинная.

2
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 19:30  [ТС]
Цитата Сообщение от somebdy Посмотреть сообщение
Что делает delete[]? Вызывает деструктор для кажд.. погоди ка, а откуда delete[] знает что нужно вызвать деструкторы для нескольких объектов? А оттуда что он delete[], а не delete.
а delete / delete[] вообще вызывает деструкторы? что то я такого не припоминаю... нам говорили что он просто освобождает память класса что то в этом роде, но деструктор он вроде бы не вызывает... ну а то что "откуда знает" это уже как программист напишет действительно...
Цитата Сообщение от somebdy Посмотреть сообщение
А еще delete[] знает сколько деструкторов вызвать, и какое кол-во памяти освободить. А это, в свою очередь, говорит о том что new[] как то сообщает delete[], чего и сколько освобождать.
а я предполагаю что delete[] просто проверяет валидность памяти, удаляет ее (делает доступной для повторного использования), сдвигается на элемент вперед и т.д. пока не встретит не валидный участок...
Цитата Сообщение от somebdy Посмотреть сообщение
Но вот чего delete[] не знает, так это того, как себя вести, если его попросят освободить память выделенную при помощи new, который общается с delete, но не с delete[]. По этому он будет вести себя как обычно, т.е пытаться освобождать память выделенную под несколько элементов, что в свою очередь ведет к неопределённому поведению. Тоже самое касается и освобождения памяти, выделенной new[], при помощи delete.
ну у меня все удаляет нормально безо всяких UB, так что касательно этого увы я не убежден но даже если допустим я попробовал юзать new char[1], толку от этого 0, в деструкторах у меня уже и так не было ошибок, а массив объектов класса по прежнему удаляется с ошибкой... (точнее не удаляется, все падает на удалении)
Цитата Сообщение от somebdy Посмотреть сообщение
Решается очень просто:
да, пожалуй так будет правильнее, без лишнего выделения памяти...
Цитата Сообщение от somebdy Посмотреть сообщение
Если поток ввода не открылся, то функция завершает своё выполнение и оставляет выделенной память под имя файла и путь. Утечка.
это уже и сам заметил исправил
Цитата Сообщение от somebdy Посмотреть сообщение
Функция sscanf ведь не выделяет память под новый контент, она пытается записать его по переданным адресам.
Но если объект типа town был инициализирован конструктором town() или town(char*), то в вашем варианте name и transport это указатели на один символ, в моем нулевые указатели. Что делать? Выделять память в нужном количестве.
а вот этого не видел, спасибо
Цитата Сообщение от somebdy Посмотреть сообщение
Ну и на последок. GetString можно чуток сократить:
хах да, пожалуй... как это я не заметил -_-
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.09.2014, 19:48
Цитата Сообщение от GetHelp Посмотреть сообщение
а delete / delete[] вообще вызывает деструкторы?
Вызывает. Вот тебе демонстрация, коли у тебя такие сомнения.
Цитата Сообщение от GetHelp Посмотреть сообщение
ну у меня все удаляет нормально безо всяких UB
В этом суть UB - что оно неопределенное. Т.е. любое. В том числе и корректное на первый взгляд.
Поговорка даже такая есть:
Правильно работающая программа - это частный случай неопределенного поведения (UB)
Коллега тебе все правильно написал.
new[] может резервировать чуть больше места (например, небольшой блок до непосредственных данных), где хранит количество выделенных элементов. Обычный new - этого не делает. Если мы попытаемся освободить через delete[] память выделенную через new (без скобок), то delete[] будет пытаться считать это количество, чтобы провести корректное освобождение. Но в этом случае информации о числе элементов не будет. Там будет либо мусор, либо вообще чужие данные. Вот тебе наглядный пример, что может произойти.
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 19:51  [ТС]
DrOffset, ок, убедили

Добавлено через 39 секунд
и все же, почему возникает ошибка при удалении массива объектов класса???
0
9 / 10 / 2
Регистрация: 18.06.2013
Сообщений: 119
22.09.2014, 19:58
Цитата Сообщение от GetHelp Посмотреть сообщение
char* transport = "автобусы, тролейбусы";
и эта строка имеет смысл???
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.09.2014, 20:01  [ТС]
Цитата Сообщение от Cryptoff Посмотреть сообщение
и эта строка имеет смысл???
нет, я ее уже убрал...

Добавлено через 1 минуту
а хотя постойте, уже не возникает никакой ошибки всем спасибо огромное
0
9 / 10 / 2
Регистрация: 18.06.2013
Сообщений: 119
23.09.2014, 07:43
Не стоит благодарности, но с указателями поаккуратнее...
Смотри... массив создал. Просто название массива - это и есть указатель, т.е.
*А = А[0]; *(A+1) = A[1];

Добавлено через 5 часов 29 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
new[] может резервировать чуть больше места (например, небольшой блок до непосредственных данных), где хранит количество выделенных элементов. Обычный new - этого не делает.
Проблема решается изменением настроек компилятора, в разделе используемая память (использую gcc).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2014, 07:43
Помогаю со студенческими работами здесь

Динамических массивов
Всем доброго дня!!!Если есть минутка, помогите сделать эти задания!буду очень благодарен!! 1. Заданы два массива А(5) и В(5)....

Использование динамических массивов
Помогите, пожалуйста. Надо выполнить задание, используя динамические массивы В массиве с четным количеством элементов (2N) находятся...

Адреса динамических массивов
Как считать конкретное количество элементов из динамического массива чар в строку string? Используя при этом адрес первого из нужных...

Обработка динамических массивов с++
Из одномерного целочисленного массива вывести те элементы, которые являются делителями для введенного с клавиатуры числа.

Создание динамических массивов
Здравствуйте. Подтолкните в верном направлении. В начале пользователь задаёт количество массивов, потом размер первого массива, потом...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru