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

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

15.03.2026, 13:57. Показов 11150. Ответов 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
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
21.03.2026, 17:55
Студворк — интернет-сервис помощи студентам
Royal_X,
Даёшь советы?
Он много подчёркивает. Я вообще нелитературен...

Основная хитрость, вот эту i надо минусовать.
0
21.03.2026, 17:58

Не по теме:

Цитата Сообщение от Наталья8 Посмотреть сообщение
Даёшь советы?
Он много подчёркивает. Я вообще нелитературен...
Все же лучше использовать это расширение, чем вообще без него. Количество ошибок в разы снизится. "искусственный интеллект" будешь писать правильно ;)
Конечно, некоторые слова оно будет подчеркивать, поскольку там словарь базовый и не содержит сленга

0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
21.03.2026, 18:11


И про сарай ещё надо у Verevkin Ещё раз проконсультироваться.
Ну так я пишу... Плотнее код получается. В страницу больше влезает.
0
21.03.2026, 18:17

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
включи проверку правописания в браузере
Это хорошо. Но не панацея. Но, да, хотя бы, будет смотреться и никому не создавать дискомфорта.
В словаре нет всех словоформ и склонений.
Не проверяется семантика предложения. [длинной/длиной]
[не/ни, раздельно/слитно]
Так что всегда можно кого то поправить, вот только зачем.
Вспомнилось автоисправления из Ворда, раньше куча приколов по этому поводу было.

Royal_X, я иногда поражаюсь твоему терпению. До сих пор пытаешься отвечать Игорю)
Тут тему нужно всю вычистить, оставить постов по теме на 1 страницу. Но это ведь нужно читать их.
Ах, да, и карточки раздать.
Может супер-модераторы вместо флуда и провокаций(некоторые) займутся работой.

0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
21.03.2026, 19:50
Цитата Сообщение от Royal_X Посмотреть сообщение
Я не понимаю все эти твои страхи: то ты занимаешься преждевременной оптимизацией, то ты считаешь количество строк кода. Вот, процитированный твой код справляется со своей задачей, так что вполне годится для использования. Хотя, если мы используем библиотечные функции, то почему бы не использовать std::stable_partition (если порядок ненулевых элементов важен) или std:artition (если этот порядок не важен)?
Ну а почему мы не можем рассмотреть/обсудить другие решения? Повторяю вопрос (а то уже нафлудили)
C++
1
2
3
4
5
6
7
8
9
10
// move zeroes down
auto & v = vec[i];
...
if (v) {
 if (i != place) {
  vec[place] = v;
  v = T();
 }
 ++place;
}
Покажите как можно улучшить этот сишный код на плюсах
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
21.03.2026, 22:29
Вы писали... Вы специалист. Вам с бугра виднее, как это улучшать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    std::vector<int> v = { 0, 1, 0, 3, 5, 0, 0, 8 };
    int  counter{};
    bool one{ false };
BEG:    
    for (int i = 0; i < v.size(); ++i) {
        if (one && v[i] == 0) { v.erase(v.begin() + i);
        --i;
        v.push_back(0);
        if (!--counter)break;
        } 
    else if (v[i] == 0)++counter;
        }
 if (!one) { one = true; goto BEG; }
 
for (int i = 0; i < v.size(); ++i)std::cout << v[i]<<"\n";
    getchar();
}
0
 Аватар для 4blK4blPblK
16 / 12 / 3
Регистрация: 01.10.2023
Сообщений: 107
21.03.2026, 22:50
Цитата Сообщение от Igor3D Посмотреть сообщение
Покажите как можно улучшить этот сишный код на плюсах
Куча норм вариантов уже дана.
Наталья8 в 96 посте ссылку дал, с (имхо) годным решением:
C++
1
2
3
4
5
6
    auto to = v.begin();
    for (auto from = v.begin(); from != v.end(); ++from)
        if (*from)
            *to++ = *from;
    
    std::fill(to, v.end(), 0);
Чем не устраивает (и свое решение в том числе)? Что значит "улучшить"?
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
21.03.2026, 23:24
Igor3D
Я не знаю плюсов, это не значит что я не понимаю что это такое.
Это фрамеворк. Написал пару слов и всё, всё, всё...
Мощщь.
Как можно улучшить с помощью фрамеворка четыре строчки на си?
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
22.03.2026, 00:45
Цитата Сообщение от 4blK4blPblK Посмотреть сообщение
ссылку дал, с (имхо) годным решением:
C++
1
2
3
4
5
    auto to = v.begin();
    for (auto from = v.begin(); from != v.end(); ++from)
        if (*from)
            *to++ = *from;
std::fill(to, v.end(), 0);
Это итераторы вместо индексов. И все-таки если в контейнере нет нулей - молотить присваивание не стоит. Согласен, решение годное, корректное. Но не лучше (не производительнее) начального
Цитата Сообщение от 4blK4blPblK Посмотреть сообщение
Чем не устраивает (и свое решение в том числе)? Что значит "улучшить"?
Ладно, немного подскажу. Конечно, если это контейнер double - никакого выигрыша нет. Но возможны такие типы элементов, что версия на С++ будет в 10 (и более) раз быстрее

Не по теме:

Цитата Сообщение от Наталья8 Посмотреть сообщение
Как можно улучшить с помощью фрамеворка четыре строчки на си?
Расклад, батенька, расклад :)

0
 Аватар для 4blK4blPblK
16 / 12 / 3
Регистрация: 01.10.2023
Сообщений: 107
22.03.2026, 02:56
Цитата Сообщение от Igor3D Посмотреть сообщение
если в контейнере нет нулей - молотить присваивание не стоит.
Хм, ну да - я хз как можно улучшить по производительности вариант на индексах. Разве что взять list вместо vector (да и то, не уверен)

Цитата Сообщение от Igor3D Посмотреть сообщение
Но возможны такие типы элементов, что версия на С++ будет в 10 (и более) раз быстрее
Какие типы? И почему будет быстрее? (быстрее чем что?)
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
22.03.2026, 11:19
Цитата Сообщение от 4blK4blPblK Посмотреть сообщение
Хм, ну да - я хз как можно улучшить по производительности вариант на индексах. Разве что взять list вместо vector (да и то, не уверен)
Это "к слову". Вот напр контейнер double без нулей. Вариант по ссылке все равно выполняет присваивание, мне кажется лучше это пресечь, пусть экономия копеечная. Индексы или итераторы - мне лично всегда больше нравились индексы, хотя никто не спорит что итераторы гибче. Дело вкуса, скорость практически одинакова

Цитата Сообщение от 4blK4blPblK Посмотреть сообщение
Какие типы? И почему будет быстрее? (быстрее чем что?)
Чем исходный вариант выше. Какие типы и почему (намного) быстрее - ну так я просто скажу ответ, будут потеряны интрига/интерес (конечно это все знали ). Ладно, вот еще подсказка
в справочнике (cppreference) прочтите описание std::remove_if, там есть очень прозрачный намек
А если хотите - просто скажу ответ
0
 Аватар для 4blK4blPblK
16 / 12 / 3
Регистрация: 01.10.2023
Сообщений: 107
22.03.2026, 11:45
Цитата Сообщение от Igor3D Посмотреть сообщение
Вариант по ссылке все равно выполняет присваивание, мне кажется лучше это пресечь,
согласен, да
Цитата Сообщение от Igor3D Посмотреть сообщение
А если хотите - просто скажу ответ
вам решать (подсказку по типам на cppreference я не увидел)
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
22.03.2026, 12:40
4blK4blPblK, кстати, std::remove_if поддерживает еще ExecutionPolicy, так что там можно поэкспериментировать, если хочется максимальной скорости.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
22.03.2026, 14:12
Цитата Сообщение от 4blK4blPblK Посмотреть сообщение
подсказку по типам на cppreference я не увидел
Вот намек
(since C++11)
Each element of [result, last) has a valid but unspecified state, because move assignment can eliminate elements by moving from elements that were originally in that range.
Никогда не читали подобного, вот это "valid but unspecified"? Странно, это одна из самых популярных фич C++11. Впрочем, если продолжить чтение, то дальше уже и прямой ответ есть
0
 Аватар для 4blK4blPblK
16 / 12 / 3
Регистрация: 01.10.2023
Сообщений: 107
22.03.2026, 15:58
Цитата Сообщение от Royal_X Посмотреть сообщение
4blK4blPblK, кстати, std::remove_if поддерживает еще ExecutionPolicy, так что там можно поэкспериментировать, если хочется максимальной скорости.
это не мне хочется, а Igor3D судя по упоминанию им производительности

Цитата Сообщение от Igor3D Посмотреть сообщение
Никогда не читали подобного, вот это "valid but unspecified"? Странно, это одна из самых популярных фич C++11
Цитата Сообщение от Igor3D Посмотреть сообщение
дальше уже и прямой ответ есть
"Валидность данных обьекта не гарантируется после его перемещения, хотя сам обьект валиден" - почему это "популярная фича"? Как это можно использовать в целом / в контексте remove_if?
Не дается мне этот ребус.
Наверное "до жирафа дойдет" если вы прямо озвучите, что за типы в: "Но возможны такие типы элементов, что версия на С++ будет в 10 (и более) раз быстрее" без намеков
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
22.03.2026, 17:54
Цитата Сообщение от 4blK4blPblK Посмотреть сообщение
если вы прямо озвучите, что за типы в: "Но возможны такие типы элементов, что версия на С++ будет в 10 (и более) раз быстрее" без намеков
Ладно Правильный ответ
C++
1
2
// vec[place] = v; 
vec[place] = std::move(v);  // может поднять скорость во много раз
Какие типы? В принципе любые, но выигрыш получается на типе с "тяжелыми" (объемными) данными, напр
C++
1
2
3
4
5
6
struct Heavy {
 std::vector<char> m_data;
 
 Heavy() : m_data(4096) {}
 ...
};
Копирование таких данных трудоемко. Использование std::move позволяет использовать "перемещение" данных, которое обычно на порядки (да-да) быстрее копирования. Правда сам собой std::move еще ничего не перемещает, объект должен уметь "перемещаться", для него должны быть определены конструктор и/или оператор перемещения, напр
C++
1
2
3
4
5
Heavy & Heavy::operator = ( Heavy && other )
{ 
 m_data.swap(other.m_data);
 return *this;
}
Необязательно это наш тип (Heavy), может быть просто вектор или др контейнер, для них все нужное уже написано. Метод swap, грубо говоря, просто переставляет указатели на данные, по сравнению с копированием это практически мгновенно. Таким образом данные быстро перемещаются куда надо (vec[place]). Правда мы испортили аргумент other (v в нашем коде), теперь в нем какое-то старье. Ну так эти данные нам и не нужны, мы их затираем в следующей строке.

Таким образом, чудо "в 10 раз" (и в 100) хотя и требует "приседаний", но совершенно возможно/реально Собсно для обхода таких тяжелых копирований и было придумано std::move
1
 Аватар для 4blK4blPblK
16 / 12 / 3
Регистрация: 01.10.2023
Сообщений: 107
22.03.2026, 18:11
Цитата Сообщение от Igor3D Посмотреть сообщение
Правильный ответ
Ах вот оно что И как я не догадался, тем более по вопросу о перемещении нулей вспомнился пример с одной книжки, где для оптимизации удаления в векторе предлагается делать как раз move() удаляемого элемента в конец вектора и pop_back(), при этом данные вектора не сдвигаются, но увы, порядок теряется. Ну да, для нетривиальных типов будет быстрее с move(), как вы написали, согласен.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
25.03.2026, 03:41
Цитата Сообщение от Igor3D Посмотреть сообщение
Копирование таких данных трудоемко. Использование std::move позволяет использовать "перемещение" данных, которое обычно на порядки (да-да) быстрее копирования. Правда сам собой std::move еще ничего не перемещает, объект должен уметь "перемещаться", для него должны быть определены конструктор и/или оператор перемещения, напр
...
Таким образом, чудо "в 10 раз" (и в 100) хотя и требует "приседаний", но совершенно возможно/реально Собсно для обхода таких тяжелых копирований и было придумано std::move
Чем-то мне это напоминает ситуацию, когда в магазине сначала втихаря повышают цены на 50%, а затем под фанфары объявляют бепрецедентную акцию - скидки аж в 35%.

Вот и здесь - сначала мы делаем ненужное трудоёмкое копирование, а затем объявляем приход "спасителя" - std::move - который нас избавит от этого ненужного копирования.

Напомню, что семантику перемещения мы и в С, и в С++ использовали с самого начала времен. Никакого std::move для этого изначально не нужно было. Да, до того, как в этой области навели порядок и все аккуратно систематизировали и снабдили необходимой поддержкой на уровне core language, приходилось извращаться, чтобы реализовать move semantics. Но ничего невозможного в этом не было и раньше.

Другое дело, что стандартные контейнеры были для этого плохо приспособлены...
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
25.03.2026, 08:13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Напомню, что семантику перемещения мы и в С, и в С++ использовали с самого начала времен. Никакого std::move для этого изначально не нужно было. Да, до того, как в этой области навели порядок и все аккуратно систематизировали и снабдили необходимой поддержкой на уровне core language, приходилось извращаться, чтобы реализовать move semantics. Но ничего невозможного в этом не было и раньше.
Другое дело, что стандартные контейнеры были для этого плохо приспособлены...
Вот примитивная структура
C++
1
2
3
4
5
6
7
8
struct Data {
 int m_id;
 char * m_content;   // new/delete
 
 operator bool( void ) const { return m_id != 0; }
};
 
std::vector<Data> theVec;
Тут уже remove_if не годится, утечка. Но никакой ужасной проблемы копирования здесь нет, нужно просто аккуратно присматривать за указателем и копировать его, а не данные. Наверно это Вы и имели ввиду под "и раньше все было". И вопросик для любителей плюсов
Как изменить наш (славный) велик чтобы он также корректно работал и для таких "неграмотных" структур как выше, имеющих "голые" указатели?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2026, 08:13

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
119
Ответ Создать тему
Новые блоги и статьи
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