【发布时间】:2018-09-18 19:33:17
【问题描述】:
我正在使用 SDL2,并创建了一个 Audio 类来处理游戏音乐和音效。声音完美无缺,但每当 Audio 类被破坏时,SDL_FreeWAV() 调用就会引发访问冲突:
Program.exe 中的 0x000000006C7A8737 (SDL2.dll) 处引发异常: 0xC0000005:访问冲突读取位置0x00007FF4A9080008
音频.h:
#pragma once
namespace Audio {
class Audio {
public:
Audio ();
Audio (char*, char*);
~Audio ();
void pause (int);
private:
Uint32 wav_length;
Uint8 *wav_buffer = NULL;
SDL_AudioSpec wav_spec;
SDL_AudioDeviceID device_id;
int success;
};
class Music {
public:
Music ();
Music (char*);
~Music ();
private:
Audio *audio = NULL;
};
class Effect {
public:
Effect ();
Effect (char*);
~Effect ();
private:
};
};
音频.cpp
#include "stdafx.h"
#include "Audio.h"
#include "SDL_audio.h"
namespace Audio {
Audio::Audio () {
//Default constructor
}
Audio::Audio (char *filename, char *channelName) {
if (SDL_LoadWAV (filename, &this->wav_spec, &this->wav_buffer, &this->wav_length) == NULL) {
std::cout << "[-] SDL: " << SDL_GetError () << "\n";
exit (ERROR_SDL_AUDIO_WAV_LOAD);
}
this->device_id = SDL_OpenAudioDevice (channelName, 0, &this->wav_spec, NULL, 0);
this->success = SDL_QueueAudio (this->device_id, this->wav_buffer, this->wav_length);
}
Audio::~Audio () {
SDL_CloseAudioDevice (this->device_id);
SDL_FreeWAV (this->wav_buffer); // <-- access violation here
}
void Audio::pause (int on) {
SDL_PauseAudioDevice (this->device_id, on);
}
};
【问题讨论】:
-
让我快速猜测一下,在某个地方制作了一个临时对象,它会在缓冲区死亡时关闭并释放您的缓冲区。如果你实现一个正确的复制(或移动)构造函数会发生什么?
标签: c++ visual-c++ access-violation