0

NAudio を使用して、.NET 4 アプリで Mp3 ファイルを再生しています。まず、WaveOut を初期化します。

IWavePlayer^ waveOutDevice = gcnew WaveOut();

それから私は2つのボタンを持っています。再生ボタン :(コード)

volumeStream = gcnew WaveChannel32(gcnew Mp3FileReader(gcnew IO::FileStream(path, IO::FileMode::Open, IO::FileAccess::Read, IO::FileShare::ReadWrite)));
mainOutputStream = volumeStream;
waveOutDevice->Init(mainOutputStream);
waveOutDevice->Play();

MP3 形式の FileStream をロードして再生します。2番目のボタンは停止です:(コード)

waveOutDevice->Stop();

再生が停止するだけです。

アプリを起動すると、5.344 KB を消費します。

s1

しかし、2 つのボタン (再生してから停止) を押すと (別の MP3 を再生していると想像してください)、約 10 回アプリが 14.912 KB を消費します。

s2

そして、この記憶を解放する方法がわかりません。MP3 を再生するには、次の NAudio オブジェクトを使用しています。

IWavePlayer^ waveOutDevice;
WaveStream^ mainOutputStream;
WaveChannel32^ volumeStream;
4

1 に答える 1

1

原則として、DisposeIDisposable を実装する .NET オブジェクトを確認する必要があります。特に、ファイルを開いたままにするだけでなく、開いている ACM ハンドルをクリーンアップしない で呼び出しDisposeていません。Mp3FileReader

.NET オブジェクトを使用する C++ プログラマーとして知っておく必要があるもう 1 つのことは、.NET はガベージ コレクションを使用するため、何かを使用し終わった後、メモリ使用量が常にすぐに下がるとは限らないということです。代わりに、管理対象オブジェクトがガベージ コレクションで使用できるようになり、そのメモリはガベージ コレクターが実行された後にのみ解放されます。

于 2012-11-24T07:31:15.110 に答える