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

Потенциальная утечка памяти

15.03.2026, 13:57. Показов 11208. Ответов 118
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогаю тут знакомому делать лабораторную по программированию на С++. Делаю в Qt так как начал его изучать.
Задание:
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) максимальный по модулю элемент массива;[1]
2) сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Вот, что у меня получилось:
C++ (Qt)
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
 main.cpp
#include <QCoreApplication>
#include<conio.h>
#include<math.h>
#include <QTextStream>
 
/* в среде разработки Qt на C++ позволяет использовать все идентификаторы
 из пространства имён std без указания префикса std::(например для count,cin,endl)*/
using namespace std;
 
int main()
{
    // задаём локализацию всех функций программы на русский язык, по умолчанию это только английский язык
    setlocale(LC_ALL, "Rus");
    QTextStream cin(stdin); cin.setCodec("CP866");         // кодировка для ввода в консоль
    QTextStream cout(stdout); cout.setCodec("CP1251");     // кодировка для вывода из консоли
    // 1
    int i,n,imax;
    float max=0;
    cout << QString::fromUtf8("Введите размерность массива n:")<< endl;
    cin >> n;
    cout << QString::fromUtf8("Введите через пробел элементы мaccива, дробную часть через точку:") << endl;
    float *p=new float[n];
    for(i=0; i<n; i++)
        cin >> p[i];
    for (max=p[0], imax=i=0; i<n; i++)
        if(fabs(p[i])>fabs(max))
        {
            max=p[i];
            imax=i;
        }
    cout << QString::fromUtf8("\nМаксимальный по модулю элемент: ") << max << endl;
    cout << QString::fromUtf8("Позиция максимального по модулю элемента: ") <<imax+1;
    // 2
    float sum=0;
    for (i = 0; i < n; i++)  // проходим циклом по длине массива
    {
        if (p[i] > 0)        // если встретим первый положительный элемент
        {
            i++;             // увеличиваем счётчик на 1  
            /* далее идём циклом пока не встретим следующий положительный элемент 
               или пока не закончиться длина массива
            */          
            while (p[i] <= 0 && i < n)  
            {                              
                sum += p[i]; // суммируем не удовлетворяющие условию элементы массива в переменную sum
                i++;         // увеличиваем счётчик на 1 
            }
            // как только выполнилось одно из условий выходим из цикла
            break;                          
        }
    }
    cout << QString::fromUtf8("\nCyммa элементов расположенных между 1 и 2 положительными элементами: ") << sum;
    // 3
    cout << QString::fromUtf8("\nПреобразованный массив:") << endl;   
    for(i=0; i<n; i++)
        if(p[i]!=0)
        {
            cout << p[i] << " ";
        }
    for(i=0; i<n; i++)
        if(p[i]==0)
        {
            cout << p[i]<< " ";
        }    
    return 0;
}
Вроде как всё работает, но появляется нехорошее предупреждение:
C++ (Qt)
1
2
D:\Examples\Option9\main.cpp:65:12: Potential leak of memory pointed to by 'p' [clang-analyzer-cplusplus.NewDeleteLeaks]
D:\Examples\Option9\main.cpp:65:12 : Потенциальная утечка памяти, на которую указывает 'p' [clang-analyzer-cplusplus.NewDeleteLeaks]
Помогите разобраться что не так.
И если можно подскажите как в этом коде сделать ЗАЩИТУ если в консоли будет набрано не правильное количество элементов.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2026, 13:57
Ответы с готовыми решениями:

Утечка памяти
Доброго времени суток. Написал оконное приложение. Столкнулся с проблемой - утекает память. ...

Шаблоны STL & утечка памяти.
Доброе время суток. Имеются 2 класса: 1)TVoteServer 2)TVoteServers - класс коллекция TVoteServer...

Утечка памяти
Доброго времени суток! Столкнулся с проблемой утечки памяти! Будь у меня маленькая программка,...

118
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 474
15.03.2026, 19:17  [ТС]
Студворк — интернет-сервис помощи студентам
Ничего не понял что 000d60 наговорил, ты в коде моём можешь показать. Я ввёл размерность 12, а набрал по ошибке 15 элементов, как мне по Enter сообщение об ошибке вывести.

Добавлено через 1 минуту
jcxz так он вообще в этом 0

Добавлено через 1 минуту
вы бы вместо того что бы критиковать реальную бы помощь оказали

Добавлено через 39 секунд
код есть покажите на примере
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
15.03.2026, 20:24
GAZot, примерно так

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
#include <iostream>
 
int main()
{
    //столько чисел ожидается
    int n=5;
    
    auto array = new double[n];
    
    for(int i=0; i<n; ++i)
    {
        double number{};
        while(1)
        {
            std::cout << "Введите число с индексом "<<i<<": ";
            std::cin>>number;
            
            if(std::cin)break;
            
            std::cin.clear();
            std::cin.ignore(1000,'\n');
            
            std::cout << "ви есть вводить плохой число!\n";
        }
        
        array[i]=number;
    }
    
    delete [] array;
}
https://onlinegdb.com/WZl57ifrOg
0
Заблокирован
15.03.2026, 21:03
Цитата Сообщение от GAZot Посмотреть сообщение
jcxz так он вообще в этом 0
Спасибо большое.

Цитата Сообщение от GAZot Посмотреть сообщение
Я ввёл размерность 12, а набрал по ошибке 15 элементов, как мне по Enter сообщение об ошибке вывести.
Но через цикл считается только 12 и это нормально используя стандартные средства.
Это штатное поведение.
basic_istream& operator>>( float& value );
(7)
basic_istream& operator>>( double& value );
(8)


Цитата Сообщение от GAZot Посмотреть сообщение
код есть покажите на примере
Если нужен больший контроль ввода, это нужно сделать самостоятельно.
И самый простой вариант я уже показал.
По ссылкам смотрел? Это мои личные листинги.

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
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <functional>
 
// return "true" if input was correct? else - "false".
bool inputDouble(const std::string &line, double & n){
    if (line.empty())
        return false;
    try{
        std::size_t past;
        n = std::stod(line, &past);
        for (std::size_t s = past; s < line.size(); ++s)
            if (!std::isspace(line[s]))
                return false;
    }
    catch(...){
        return false;
    }
    return true;
}
 
bool filter_int(const std::string& str, int & res){
   res = 0;
   try{
      std::size_t pos{};
      res = std::stoi(str, &pos);
      if (std::find_if(str.begin()+pos, str.end(), 
                           [](unsigned char ch){
                              return !isspace(ch);
                           })  != str.end())
         return false;
   }catch (const std::exception& e){
      return false;
   }
   return true;
} 
int main()
{
   int n = 0;
 
   const int nmin = 1, nmax = 10;
 
   std::string input;
   
   std::cout << "Set the array length (" << nmin << ", " << nmax << "): ";
   while(std::getline(std::cin, input) 
         && (!filter_int(input, n) || !(n >= nmin && n <= nmax)))
      std::cout << "Wrong input, try again : ";
 
   
   double *arr = new double[n];
   
   for(int i = 0; i != n; ++i){
      std::cout << "Enter " << i+1 << "-th real number: ";
      double val;
      while(std::getline(std::cin, input) && !inputDouble(input, val))
         std::cout << "Wrong input, try again : ";
      arr[i] = val;
   }
   
   std::cout << "Input array is : ";
   for(int i = 0; i != n; ++i)
      std::cout << arr[i] << ' ';
   std::cout << std::endl;
   
   delete [] arr;
}
Всё то, на что ссылался выше, применил.
Тут можно долго об этом говорить, но в итоге останется только "фильтр ввода", который будет удовлетворять полностью свои пожелания.
Что ещё показать?
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 474
15.03.2026, 21:37  [ТС]
Алексей1153 я так понял, что если не объявить столько чисел ожидается, это не разрешимая задача, да а я думал вы реально гуру здесь собрались

Добавлено через 3 минуты
вы реально считаете, что это правильный подход к решения задач

Добавлено через 4 минуты
хорошо спрошу по другому можно ли узнать сколько элементов введено в консоль
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
15.03.2026, 21:41
GAZot, не понял вопрос. Что неразрешимо ?

Берёшь вектор и пихаешь туда числа до посинения, он резиновый

Добавлено через 30 секунд
Цитата Сообщение от GAZot Посмотреть сообщение
можно ли узнать сколько элементов введено в консоль
можно, считываешь их и считаешь

Добавлено через 1 минуту
GAZot, на самом деле консоль сейчас особо никому не нужна. Чисто на этапе изучения языка побаловаться

Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
считываешь их и считаешь
для любителей сильных ощущений можно даже попытаться закачать обратно в ютуб засунуть считанное обратно на консоль
https://en.cppreference.com/w/... tback.html

но зачем
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 474
15.03.2026, 21:54  [ТС]
Да может я и не понимаю, но только поучения поучения и только, я вроде уже объяснил что хочу. Вы даже на этапе консоли не можете толком объяснить.
0
Заблокирован
15.03.2026, 21:59
Цитата Сообщение от GAZot Посмотреть сообщение
Вы даже на этапе консоли не можете толком объяснить.
Да куда там пояснить, мы понять не можем, чего же ты желаешь.

А что там с треугольником?
Пифагор с Архимедом спрашивают просто.
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 474
15.03.2026, 22:18  [ТС]
Лыко да мачало начинай сначало:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 main.cpp
#include <QCoreApplication>
#include<conio.h>
#include<math.h>
#include <QTextStream>
 
/* в среде разработки Qt на C++ позволяет использовать все идентификаторы
 из пространства имён std без указания префикса std::(например для count,cin,endl)*/
using namespace std;
 
int main()
{
    // задаём локализацию всех функций программы на русский язык, по умолчанию это только английский язык
    setlocale(LC_ALL, "Rus");
    QTextStream cin(stdin); cin.setCodec("CP866");         // кодировка для ввода в консоль
    QTextStream cout(stdout); cout.setCodec("CP1251");     // кодировка для вывода из консоли
    // 1
    int i,n,imax;
    float max=0;
    cout << QString::fromUtf8("Введите размерность массива n:")<< endl;
    cin >> n;
    cout << QString::fromUtf8("Введите через пробел элементы мaccива, дробную часть через точку:") << endl;
Я ввёл размерность - 12, а элементов ввёл 15 и нажал Enter, хочу что бы в консоль мне выдало сообщение типа вашего прикольного как вы считаете
C++ (Qt)
1
std::cout << "ви есть вводить плохой число!\n";
0
Заблокирован
15.03.2026, 22:28
Цитата Сообщение от GAZot Посмотреть сообщение
ввёл 15 и нажал Enter
Воод нескольких значений - это уже немного другая ситуация и может потребовать/иметь различные способы решения при неверном вводе.
Например:
- ввести все данные заново,
- проигнорировать весь остальной ввод если необходимое количество было прочитано
- запросить ввод дополнительных данных, если было введено меньше.

Невооруженным глазом, видно, что это уже другая задача.
Но решается она точно теми же средствами.
Считываем строку-ввод, разбиваем на независимые единичные данные, называются "словами"(набор символов разделенный пробельными символами).
Отдаем каждое "слово" на валидацию.

Показать кодом?
Наверное, я просто посмотрю, на этот раз.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
15.03.2026, 22:32
Цитата Сообщение от GAZot Посмотреть сообщение
Я ввёл размерность - 12, а элементов ввёл 15 и нажал Enter, хочу что бы в консоль мне выдало сообщение типа вашего прикольного как вы считаете
Вот, пример: если введешь больше или меньше, получишь ошибку, если введешь ровно столько, сколько и задал, то выведутся элементы массива

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
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
 
int main() 
{
    int n;
    std::string input;
    
    std::cout << "Enter the array size n: ";
    std::cin >> n;
    
    std::cin.ignore();
    
    std::cout << "Enter " << n << " numbers separated by spaces: ";
    std::getline(std::cin, input);
    
    std::istringstream iss(input);
    std::vector<int> numbers;
    int num;
    int count = 0;
    
    while (iss >> num) 
    {
        numbers.push_back(num);
        count++;
    }
    
    if (count != n) 
    {
        std::cerr << "Error: Expected " << n << " numbers, but got " << count << std::endl;
        return 1;
    }
    
    std::cout << "Array elements: ";
    for (int i = 0; i < n; i++) 
    {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;
    
}
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 474
15.03.2026, 22:39  [ТС]
Опять поток слов непонятно для чего, хочешь помочь помоги, а так зачем этот трёп

Добавлено через 3 минуты
Royal_X спасибо, если что большое, у меня уже за полночь, проверю только уже завтра.
0
Заблокирован
15.03.2026, 22:40
Royal_X, ТС наверное хочет что бы мы ему автомат с нуля написали)
То что делается типово и просто, сделать сложно и нафиг никому не нужно)

Цитата Сообщение от GAZot Посмотреть сообщение
дробную часть через точку
А это уже локальная(Элемент локализация) штука и про это тоже нужно подумать.
В разных локализациях, разделитель целой и дробной части разный.
И setlocale(LC_ALL, "Rus"); как раз таки устанавливает... какую локаль?
И какой разделитель у формате дробных чисел там?

Так, так, всё, я молчу. Налил чефирчику, взял бублик и наблюдаю, когда же ТС будет удовлетворен, и чем.

Добавлено через 36 секунд
Цитата Сообщение от GAZot Посмотреть сообщение
хочешь помочь помоги
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
15.03.2026, 22:45
Цитата Сообщение от 000d60 Посмотреть сообщение
А это уже локальная(Элемент локализация) штука и про это тоже нужно подумать.
В разных локализациях, разделитель целой и дробной части разный.
И setlocale(LC_ALL, "Rus"); как раз таки устанавливает... какую локаль?
да, вижу, что ТС использует библиотечную корявую setlocale... Раз уже подключен Qt, почему бы не юзать более стабильные функции из фреймворка, например,

C++
1
2
3
#include <QLocale>
QLocale::setDefault(QLocale::system()); // устанавливает системную локаль
QLocale::setDefault(QLocale(QLocale::Russian)); // или можно явно указать русскую
когда локаль будет установлена, то десятичный разделитель будет выбираться согласно локали
0
Заблокирован
15.03.2026, 23:05
Royal_X, везде где можно установить локаль, можно и дернуть тип разделителя.
C++
1
   std::cout << std::use_facet< std::numpunct<char> >(std::locale()).decimal_point();
C++ (Qt)
1
QString QLocale::decimalPoint() const
И выбор, не указывать пользователю как ему вводить и использовать системную локаль.
Или выбрать нужную локаль/средства для чтения чисел.
Это уже если делать по-хорошему.
А то может получится очень весело)

Плохой с++, плохой. Ничего он не умеет.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
15.03.2026, 23:20
Цитата Сообщение от 000d60 Посмотреть сообщение
можно и дернуть тип разделителя
чтобы написать велосипед для ручной обработки чисел? но зачем? выставляем локаль и ожидаем от пользователя, что он будет вводить числа с плавающей запятой с десятичным разделителем, свойственным системной локали.
0
Заблокирован
15.03.2026, 23:47
Цитата Сообщение от Royal_X Посмотреть сообщение
чтобы написать велосипед для ручной обработки чисел? но зачем?
Нет. Что бы подсказать пользователю в каком формате вводить.
В контексте QT, в частности, в поле ввода, прикрепив валидатор, что бы он подсказал.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
16.03.2026, 00:07
Цитата Сообщение от 000d60 Посмотреть сообщение
В контексте QT, в частности, в поле ввода, прикрепив валидатор, что бы он подсказал
ты сейчас описываешь, как порнографию создавать) не нужен никакой кастомный валидатор. Берешь QDoubleSpinBox и просто радуешься. Там валидатор уже встроен. Юзер даже при желании не сможет ввести в поле бяку. Автоматически выведется предупреждение.
Мало того, что можешь выставить лимиты для вводимого числа, так еще поддерживаются префиксы и суффиксы.
Так что, коль ТС юзает Qt, то пусть по максимуму берет функции из фреймворка, а не пишет лисапеды на чистом С++.
А если он не хочет юзать спинбокс, то он может просто взять QDoubleValidator, а не писать свой.
0
Заблокирован
16.03.2026, 00:40
Цитата Сообщение от Royal_X Посмотреть сообщение
он может просто взять QDoubleValidator, а не писать свой
Может, а он подскажет что ожидается в вводе, допустим плавающей подсказкой?
Конечно, всё это мелочи, так же как и ручной ввод 15 чисел вместо 12-ти одной строкой.
И это мы ещё даже "корыто"(привет Вовке) не сделали.
Ждем-с вердикта.
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 474
16.03.2026, 06:41  [ТС]
Royal_X попытался понять ваш диалог о разделителях, так и не понял, если дробное число как быть и ещё можно после выдачи сообщения об ошибке заново набрать правильно.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
16.03.2026, 10:50
GAZot, мой код был лишь для примера, там числа в массиве целые, но если нужны float, double, то используй их - там лишь поменять в нескольких местах.
Если нужно, чтобы после ошибки был повторный ввод, то меняй логику программы, сейчас прога завершается после ошибки. Делай бесконечный цикл для ввода, при count == n выходи из цикла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2026, 10:50

Будет ли утечка памяти при выполнении данного кода?
собстна, сабж. char* cpy(char* source, int pos, int kolv) { char* dist = new char; for(int...

Утечка памяти в работе с классами
вроде утечка памяти наблюдается в функции &quot;loadfromfile&quot;, помогите пожалуйста исправить ...

Утечка памяти, пользуюсь vld
Начал разбираться чо это такое, утечка памяти. Как самы простой способ нашел программу Visual Leak...

Утечка памяти при умножении матрицы на число
Всем доброго времени суток. Хочу спросить у Вас совета по поводу распределения памяти в...

Утечка памяти CppWebBrowser
Всем здравствуйте У меня возникла проблема: Утечка памяти CppWebBrowser вот код IHTMLDocument2...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru