134 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,784
1

SafeArrayGetElement - вызывает утечку памяти

08.10.2020, 17:38. Показов 20925. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста, не могу понять, куда исчезает память:

C++
1
2
3
4
5
6
7
8
9
int main()
{
 
for(int i=0; i<1000; i++)
{
     My_Get_Range(); //Вызываю функцию
}
 
}
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
void My_Get_Range()
{
//Читаю данные из Ексель
 
......
 
// Создаем Variant массив, куда будет записаны данные из нужного диапазона ексель: -------------------------------------
        
VARIANT arr;
arr.vt = VT_ARRAY | VT_VARIANT;
    {
        SAFEARRAYBOUND sab[2];
        arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
    }
//------------------------------------------------------------------------------------------------------------------------------------------
 
 
AutoWrap(DISPATCH_PROPERTYGET, &arr, pXlRange, (LPOLESTR)L"Value", 0); // Вызываем AutoWrap с MSDN`а
 
 
VARIANT v;
VariantInit(&v); // переменная куда будем записывать/доставать элемент из массива arr
 
 
 
 
for (int i = 0; i < 1000000; i++)
    {
 
        long indexes[2] = { 1,  1 };
 
        SafeArrayGetElement(arr.parray, indexes, &v); // получим указанный элемент по индексу из arr в переменную v
 
        BSTR ival_bstr = v.bstrVal;
        string Finaly_value;
 
        Finaly_value = _com_util::ConvertBSTRToString(ival_bstr); //Тут значение string взятой по индексу 1,1 из массива arr
    }
 
 
    pUnk->Release();
    pXlRange->Release();
    pXlSheet->Release();
    pXlApp->Release();
 
    VariantClear(&arr);
    VariantClear(&v);
 
    CoUninitialize();
}
И вот я не понимаю - с каждой итерацией цикла - память заполняется и заполняется:
- Куда она выделяется внутри цикла.
- И самое главное, что по завершении функции My_Get_Range - ничего не очищается автоматически. И с началом вызова этой же My_Get_Range функции - память начинает тратится + к тому, что уже был выделено в предыдущем вызове My_Get_Range.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2020, 17:38
Ответы с готовыми решениями:

Выделение памяти, проверка на утечку памяти
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки...

Проверка на утечку памяти
Есть оконное приложение где куча контейнеров и т.д. Как можно проверить, есть ли утечки памяти?...

Изолировать утечку памяти
Есть давний проект. В нем есть утечка памяти. Разобраться с самой утечкой - долго, там, судя по...

Найти утечку памяти
Приветствую всех! Много раз слышал, что с помощью CodeGuard можно проверить есть ли в приложении...

4
6578 / 4563 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
08.10.2020, 17:52 2
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
И вот я не понимаю - с каждой итерацией цикла - память заполняется и заполняется:
VariantClear не вызываешь в цикле

C++
1
2
3
       Finaly_value = _com_util::ConvertBSTRToString(ival_bstr); //Тут значение string взятой по индексу 1,1 из массива arr
VariantClear(&v);
    }
Добавлено через 2 минуты
А лучше воспользуйся классом variant_t
C++
1
2
3
4
5
6
7
8
long indexes[2] = { 1,  1 };
 
_variant_t v;       
    SafeArrayGetElement(arr.parray, indexes, &v); // получим указанный элемент по индексу из arr в переменную v
 
    string Finaly_value;
 
    Finaly_value = _com_util::ConvertBSTRToString(v.bstrVal); //Тут значение string взятой по индексу 1,1 из массива arr
1
134 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,784
08.10.2020, 18:00  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
VariantClear не вызываешь в цикле

А лучше воспользуйся классом variant_t
Неа, не помогает, память также увеличивается и все тут.
0
6578 / 4563 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
08.10.2020, 18:03 4
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Неа, не помогает, память также увеличивается и все тут.
C++
1
2
3
char *psz = _com_util::ConvertBSTRToString(V_BSTR(&v)); //Тут значение string взятой по индексу 1,1 из массива arr
 Finaly_value = psz;
 delete[] psz;
Добавлено через 9 секунд
https://docs.microsoft.com/ru-... ew=vs-2019
1
134 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,784
08.10.2020, 18:05  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Вотжежь блин, Спасибо!!
0
08.10.2020, 18:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2020, 18:05
Помогаю со студенческими работами здесь

Проверка на утечку памяти
Всем доброго времени суток. Сразу оговорюсь, я не профессионал, программирование - моё хобби,...

Как отследить утечку памяти?
Как в vs(ну или в общем) отследить учтечку памяти? То есть если было выделено память под что то с...

Вопрос про утечку памяти в Qt
У меня вопрос. В этом коде: #include &lt;QApplication&gt; #include &lt;QFont&gt; #include &lt;QPushButton&gt;...

Qt Creator проверка на утечку памяти
Всем привет! Подскажите как в Qt Creator проверить код на утечку памяти. Какие утилиты...

Найти утечку памяти программно
Есть программа (под 700 строк) в которой есть утечка памяти в размере, с помощью чего можно...

Про деструктор и утечку памяти
Доброе время суток. Вот что дано: #include &lt;string&gt; #include &lt;vector&gt; class Symbols {...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru