Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
1

Дебри указателей - охота на память

02.10.2014, 14:29. Показов 640. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Случай: *p->CreateSoundFromFile(&p)->(*p=new)->p->Release();
Освобождается ли память верно с массива в указателе и с самого указателя при методе Release()?
Код: Главные моменты (около 7 строк )выделил комментарием //(!!!!!!!!!!!!!!!!!!!!!!!!)

Кликните здесь для просмотра всего текста
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
#include <windows.h>
#include <xaudio2.h>
 
 
struct AudioBuffer
{
    WAVEFORMATEXTENSIBLE wfx;
    XAUDIO2_BUFFER  buffer;
    bool Release(){delete [] buffer.pAudioData; delete this ; return true;}  //(p->Release())(!!!!!!!!!!!!!!!!!!!!!)
};
 
AudioBuffer * yo = NULL;  //(!!!!!!!!!!!!!!!!!) (*p)
 
bool CreateSoundFromFile(AudioBuffer **audio);  //(!!!!!!!!!!!!!!!!!!!!!!!!) (&p)
 
 
 
 
int main()
{
 
CoInitializeEx(NULL, COINIT_MULTITHREADED); // тут второй вопрос.
 
    
CreateSoundFromFile( &yo);  //(!!!!!!!!!!!!!!!!!!!)
 
 
IXAudio2SourceVoice* pSourceVoice;
if( FAILED(hr = pXAudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&yo->wfx,
    0, XAUDIO2_DEFAULT_FREQ_RATIO, NULL, NULL, NULL ) ) ) return hr;
if( FAILED(hr = pSourceVoice->SubmitSourceBuffer( &yo->buffer ) ) ) return hr;
 
if ( FAILED(hr = pSourceVoice->Start( 0, XAUDIO2_COMMIT_NOW ) ) ) return hr;
system("pause");
pSourceVoice->Stop();
 
 
yo->Release();  //(!!!!!!!!!!!!!!!)
}
 
 
 
 
bool CreateSoundFromFile(AudioBuffer ** yo)
{
    AudioBuffer * t = new AudioBuffer;  //(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
    ZeroMemory(t,sizeof(AudioBuffer));  //(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
    
 
// Open the file
HANDLE hFile = CreateFile(
    L"MusicMono.wav",
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    0,
    NULL );
 
if( INVALID_HANDLE_VALUE == hFile )
    return HRESULT_FROM_WIN32( GetLastError() );
if( INVALID_SET_FILE_POINTER == SetFilePointer( hFile, 0, NULL, FILE_BEGIN ) )
    return HRESULT_FROM_WIN32( GetLastError() );
 
DWORD dwChunkSize;
DWORD dwChunkPosition;
//check the file type, should be fourccWAVE or 'XWMA'
FindChunk(hFile,fourccRIFF,dwChunkSize, dwChunkPosition );
DWORD filetype;
ReadChunkData(hFile,&filetype,sizeof(DWORD),dwChunkPosition);
if (filetype != fourccWAVE)
    return S_FALSE;
FindChunk(hFile,fourccFMT, dwChunkSize, dwChunkPosition );
ReadChunkData(hFile, &t->wfx, dwChunkSize, dwChunkPosition );
//fill out the audio data buffer with the contents of the fourccDATA chunk
FindChunk(hFile,fourccDATA,dwChunkSize, dwChunkPosition );
 
BYTE * pDataBuffer = new BYTE[dwChunkSize];  //(!!!!!!!!!!!!!!!!!!!!!!!!)
 
ReadChunkData(hFile, pDataBuffer, dwChunkSize, dwChunkPosition);
 
t->buffer.AudioBytes = dwChunkSize;   //(!!!!!!!!!!!!!!!!!!!!!!!)
t->buffer.pAudioData = pDataBuffer;  
t->buffer.Flags = XAUDIO2_END_OF_STREAM; 
 
*yo=t; //(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
 
return true;
 
};

и Второй вопрос(не главный) по поводу CoInitializeEx(NULL, COINIT_MULTITHREADED);. Нужно ли оно и как от него избавиться?!
и Третий чем можно искать утечки памяти легко и быстро?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2014, 14:29
Ответы с готовыми решениями:

Не освобождается память в списке указателей на класс
#include &lt;iostream&gt; #include &lt;list&gt; using namespace std; class myClass{ private: int x;...

Как работает арифметика указателей, память массивов
В книге : х Это тоже самое что *(х+3)=120 Птм он грит : значение х в данном случае увеличивается...

Выделить память под динамический массив указателей
Нужно выделить память вот под такое дело. Для примера n=5 . Ничего нагуглить так и не смог :( что...

Выделяется память для массива указателей нежелательно освобождается
Как вы видите, здесь выделяется память для массива указателей на &quot;строки&quot; analyzedTextArray, этот...

5
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
02.10.2014, 14:36 2
Цитата Сообщение от TierX Посмотреть сообщение
Освобождается ли память верно с массива в указателе и с самого указателя при методе Release()?
сокрее всего нет, Вы метода Release выполнили для AudioBuffer;
а сам AudioBuffer не удаляли
т.е

C++
1
2
3
yo->Release();  //(!!!!!!!!!!!!!!!)
delete yo;
}
Добавлено через 1 минуту
Цитата Сообщение от TierX Посмотреть сообщение
BYTE * pDataBuffer = new BYTE[dwChunkSize]; //(!!!!!!!!!!!!!!!!!!!!!!!!)
насчет этого освобождения, думаю надо узнать освобождает ли эту память метод Release
0
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
02.10.2014, 14:37  [ТС] 3
a delete this не?. Хотелось бы просто за один метод както все уладить.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
02.10.2014, 14:43 4
TierX, а сори пропустил, я думал этото класс не Ваш, ну и че норм, все удалено)
1
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
02.10.2014, 14:47  [ТС] 5
aLarman, Спасибо.
Просто я обычно юзаю _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); для утечек но CoInitializeEx(NULL, COINIT_MULTITHREADED); его както нетрализует. Хотелось бы найти еще решение для обнаружения утечек на любые случаи...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
02.10.2014, 16:25 6
TierX, насчет утечек риалтайм, не поскажу, наверняка не анйдется решение на все случаи жизни...или какие нить shared_ptr unique_ptr///
0
02.10.2014, 16:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2014, 16:25
Помогаю со студенческими работами здесь

Как выделить память для двумерного массива указателей в куче?
Есть массив вида: unsigned char *ddtКак выделить память для такого массива в куче? Должен...

Дебри C#. Правильное погружение
Всем привет. Работаю программистом и встала цель изучить C#. Базовые знания по языку есть(логику...

создание VCL::дебри
Доброго времени суток, господа. я взялся писать свой DBGrid (потомок TCustomControl) и получается...

Можно ли динамически выделить память под массив указателей, на объекты класса?
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно сформулировать. Можно ли...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru