Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
3 / 2 / 1
Регистрация: 14.06.2014
Сообщений: 61

Динамическое создание элементов

30.03.2026, 11:57. Показов 4970. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с проблемой при создании элементов класса и переменных строк std:str через new/delete с неизвестным заранее количеством элементов. При запуске программы, я считываю из XML файла параметры, которые задают необходимое мне количество элементов. Я давно изучал это в институте и писал программы в вижл студии 2012.

Вот пример моей работы. писал тогда в стиле обычного Си.

Кликните здесь для просмотра всего текста
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
void arrays () {
    int n, i, sum = 0; //объявляем переменные размерности массива, счётчика и суммы значений.
    printf("Введите N размерность массива:\n"); //Вывод запроса размерности массива
    scanf("%u", &n); //Считываем размерность
    int *numerics = new int[n]; //Создаём массив заданной размерности
    printf("Введите %d целочисленных элементов:\n", n); //Вывод запроса элементов
    for(i = 0; i < n; ++i){ //циклически считываем элементы в массив 
        scanf("%i", &numerics[i]);
    }
    for(i = 0; i < n; ++i){ //В цикле считаем сумму положительных элементов
        if (numerics[i] > 0) { //Условие для положительных элементов
            sum = sum + numerics[i];
        }
    }
    delete [] numerics; //Удаляем массив
    printf("Сумма положительных элементов равна %d\n", sum); //Выводим результат
 
    system("pause"); //Задержка завершения программы
}
 
int LString (char * str) //Функция подсчёта символов в строке
{
    int i = 0;
    while (str[i] != 10) i++;
    return i;
}


Сейчас оно в студии 2022 не работает. Ошибки на функции scanf: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Соответственно, когда столкнулся с разработкой приложения, где мне нужно создавать экземпляры класса и массив строковых переменных, я обратился к этим работам, пошёл по этому примеру.

Кликните здесь для просмотра всего текста
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
bool runServer()
{
    int srvNumber;
    const char* cstr;
    //std::string* srvIP;
    std::string cliAdress;
    TS7Client* myClient;
    TS7Server* myServer;
    std::string* srvIP;
    byte DataMB[20];
    
    //Заготовка под чтение параметров
    
    if (doc.LoadFile("config.xml") != tinyxml2::XML_SUCCESS) {
        std::cout << "file config.xml not found in execute folder\nconfigure the parameters\nstart server terminate" << std::endl;
        Sleep(1000);
        return false;
    }
    
    tinyxml2::XMLElement* configuration = doc.FirstChildElement("configuration");
    if (!configuration) {return true;} //добавить аварийное сообщение об отсутствии конфига
 
    // Получение элемента с параметром
    tinyxml2::XMLElement* srvSetting = configuration->FirstChildElement("srvSetting");
    if (!srvSetting){ return true;} //добавить аварийное сообщение об отсутствии конфига
    srvSetting->QueryStringAttribute("cliAdress", &cstr);
    cliAdress = cstr;
        srvSetting->QueryIntAttribute("srvNumber", &srvNumber);
    srvIP = new  std::string[srvNumber];
 
    for (size_t counter = 0; srvNumber; counter++)
    {
        srvSetting->QueryStringAttribute(srvIP[0].c_str(), &cstr);
        srvIP[srvNumber] = cstr;
    }
    
    myClient = new TS7Client();
    myServer = new TS7Server[srvNumber];
    std::cout << "Client work to IP:" << cliAdress << std::endl;
    for (size_t counter = 0; srvNumber; counter++)
    {
        //myServer[srvNumber].RegisterArea(srvAreaMK, 1, &DataMB, sizeof(DataMB));
 
        myServer[srvNumber].StartTo(srvIP[srvNumber].c_str());
        myServer[srvNumber].Start();
        std::cout << "Server" << counter << " start on IP:" << srvIP[counter] << std::endl;
    }
    
    //Цикл копирования данных с ПЛК на серверы
    
    std::cout << "Server running\npress s to stop server" << std::endl;
    while (true) {
        if (_kbhit()) { // Проверяем, нажата ли клавиша
            char key = _getch(); // Считываем нажатую клавишу
            if (key == 's' || key == 'S' || key == 'ы' || key == 'Ы') { // Условие останова программы
                break;
            }
        }
        myClient->ConnectTo(cliAdress.c_str(), 0, 2);
        myClient->MBRead(0, 20, &DataMB);
        myClient->Disconnect();
        Sleep(1000);
    }
    
    //for (size_t counter = 0; srvNumber; counter++)
    //{
    //    delete myServer;
    //}
    delete myServer;
    delete myClient;
 
    return false;
}


Код компилируется, но при запуске приложения ошибка приложения 0xc000007b

В студии 3 предупреждения:
Чтение недопустимых данных из "srvIP": доступный для чтения объем равен "(size_t)*32" байт, однако считать можно только "srvNumber" байт.
Чтение недопустимых данных из "myServer": доступный для чтения объем равен "(size_t)*8" байт, однако считать можно только "srvNumber" байт.
Память для "myServer" выделена при помощи оператора new [] для массивов, а удаляется скалярным оператором delete. Деструкторы не будут вызваны.

При попытке делать delete для myServer с индексами массива, так же ошибка в студии:
выражение должно представлять собой указатель на полный тип объекта
Хотя изначально я предполагал перебрать массив в цикле для удаления всех элементов.

Подскажите, где я тут рукожоп.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2026, 11:57
Ответы с готовыми решениями:

Создание статической переменной vs. Динамическое создание одной переменной
Привет. Недавно назрел вопрос - а в чем разница между созданием статической переменной и...

QML. Динамическое создание элементов
Доброго времени суток форумчане. :handshake: В прикрепленной картинке отображается схема...

Динамическое создание элементов qt
Требуется создать динамически элементы. При нажатии на кнопку появляются экземпляры QComboBox,...

30
фрилансер
 Аватар для Алексей1153
6508 / 5760 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
10.04.2026, 06:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ID_Hacker Посмотреть сообщение
std::vector это не полноценные динамические массивы
вполне себе внутри вектора полноценная динамическая память используется. А при чём тут строки ?
0
 Аватар для vlisp
1121 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,448
10.04.2026, 09:07
Цитата Сообщение от ID_Hacker Посмотреть сообщение
Не зная задачу, не осуждай её.
Скорей всего ты чего-то не так напроектировал
0
 Аватар для 4blK4blPblK
16 / 12 / 3
Регистрация: 01.10.2023
Сообщений: 107
10.04.2026, 16:21
Цитата Сообщение от ID_Hacker Посмотреть сообщение
привык на Си к обычным new/delete
new/delete это С++
Цитата Сообщение от ID_Hacker Посмотреть сообщение
std::vector это не полноценные динамические массивы ... а только строки
Всмысле? Если имеется ввиду std::string, то там тоже есть "operator[]" и прочее.
Цитата Сообщение от ID_Hacker Посмотреть сообщение
Зачем делать разные реализации
Не уверен, что понимаю про какие реализации сказано. Например, сырые указатели С++ (про чистый С вообще молчу) требуют очень аккуратного отношения к своей реализации:
C++
1
2
3
4
5
6
{
MyClass *object= new MyClass;
//в этом месте произошел непродуманный / непредвиденный выход из области видимости 
delete object; //и всё, delete не выполняется, утечка
if(object) object->someFoo(); // забыли object=nullptr после delete -> потенциальное UB 
}
А std::shared_ptr заботится о подобных проблемах, но работает несколько медленнее (как говорят)
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,375
11.04.2026, 01:13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//========================================= 
    std::vector <std::thread> th_vec;
    int n(0);
    while (true){
    VideoCapture cap(n); // open the video camera no. 0
        if (cap.isOpened())  // if not success, exit program
            th_vec.push_back(std::thread(fork, cap, n));// Передача параметров через запятую, после fork 
        else { cout << "ERROR:  camera <"<< n <<"> not found" << endl; break; }// Если камер нет n останеться нулём
                Sleep(2000); ++n;
             }
    // while (1){ if (KEYDOWN(VK_ESCAPE))break; Sleep(50); }
    for (int i = 0; i < n; ++i){// при выходе из нулевого потока, подвешивает по очереди остальные
        th_vec.at(i).join();
            }
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,375
11.04.2026, 01:18


C++
1
2
3
4
std::vector<sf::Sprite>spr;
                spr.push_back(sprite); spr.push_back(sprite1); spr.push_back(sprite4);
                spr.push_back(sprite2); spr.push_back(sprite6); spr.push_back(sprite7); spr.push_back(wid_sprite);
                unsigned char isMove_shr{};
Или я дуррак, или лыжи не едут...
0
 Аватар для vlisp
1121 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,448
11.04.2026, 10:09
Прекращайте писать, как будто у вас дислексия и слабоумие
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,375
11.04.2026, 13:55
vlisp,
Место такое... Я у вас здесь почитал...
И ничего умного в голову не приходит...
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,375
11.04.2026, 14:09
filt_file(1).mp4
Да и я вот тоже на буратино похож.. Тоже деревянный.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,375
11.04.2026, 15:03
Раньше здесь, люди не очень компетентные, задавали вопросы.
А люди имеющие опыт, им помогали стать более компетентными.
А сейчас эти люди ведут какие то дискуссии, хрен по чём...
Что не способствует ни какому получению ни каких знаний.
И если я здесь начну умничать,
это будет глас в пустыне.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,223
Записей в блоге: 2
11.04.2026, 15:34
Если new для массива, то и (парное) delete должно быть для массива
C++
1
2
3
myServer = new TS7Server[srvNumber];
...
delete [] myServer;
Так будет вызван деструктор для каждого элемента. Удалять в цикле неправильно, т.к. выделен один блок памяти (для всего массива). И вместо пары new/delete обычно гораздо комфортнее контейнер, напр
C++
1
2
3
std::vector<TS7Server> myServer;
...
myServer.resize(srvNumber);
Вообще за указателями надо присматривать, некоторые вообще стремятся полностью избавиться от "голых" указателей
Цитата Сообщение от ID_Hacker Посмотреть сообщение
myClient = new TS7Client();
...
delete myClient;
Зачем тут указатель? Чтобы ловить блох с delete и чесать репу если потребуется исключение? Просто
C++
1
TS7Client myClient:
Стремитесь чтобы все удалялось автоматом/пулеметом
0
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,272
Записей в блоге: 6
10.05.2026, 07:30
Цитата Сообщение от ID_Hacker Посмотреть сообщение
Сейчас оно в студии 2022 не работает. Ошибки на функции scanf: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
На всякий случай... Если, как написано, указать
C++
1
#define _CRT_SECURE_NO_WARNINGS
первой строкой файла, то всё работает для этой и других "небезопасных" по мнению Microsoft функций.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2026, 07:30

Динамическое создание компонентов TImage's.
Доброго времени суток, уважаемые жители форума. В создании динамических массивов почти полный...

Компоненты - динамическое создание
Народ подскажите как создать эти 5 эдитов не на Form1 , а например на TabControl1 на 3 вкладке!!!...

Динамическое создание компонентов
Подскажите, пожалуйста, как решить проблему. В проекте есть 2 формы. На первой форме есть кнопка,...

Динамическое создание кнопок
Как создать кнопку, я примерно представляю: TSpeedButton *lbl; lbl=new TSpeedButton(this);...

Динамическое создание компонента
Есть класс. В реализации одного метода динамически создается TabSheet, RichEdit. В другом методе...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru