读取C+中的wav文件+;仅在发布时崩溃(在调试时工作正常) 我正在读C++中的WAV文件,它只是在发布模式下运行程序时崩溃。
我收到以下错误消息: 对象0x7fc7b3d2b1f8错误:已释放对象的校验和不正确-对象可能在被释放后被修改。“或”分段错误:11` 在调试模式下运行程序时,它可以读取和播放wav文件读取C+中的wav文件+;仅在发布时崩溃(在调试时工作正常) 我正在读C++中的WAV文件,它只是在发布模式下运行程序时崩溃。,c++,audio,C++,Audio,我收到以下错误消息: 对象0x7fc7b3d2b1f8错误:已释放对象的校验和不正确-对象可能在被释放后被修改。“或”分段错误:11` 在调试模式下运行程序时,它可以读取和播放wav文件 void WaveFormat::Load(std::string filename) { std::ifstream file(filename, std::ifstream::binary); if (file.good()) { file.read(chunkID, WaveFormat::NUM
void WaveFormat::Load(std::string filename) {
std::ifstream file(filename, std::ifstream::binary);
if (file.good()) {
file.read(chunkID, WaveFormat::NUM_CHARS);
file.read(reinterpret_cast<char *>(&chunkSize),
sizeof(unsigned int));
file.read(format, WaveFormat::NUM_CHARS);
file.read(subChunkID, WaveFormat::NUM_CHARS);
file.read(reinterpret_cast<char *>(&subChunkSize),
sizeof(unsigned int));
file.read(reinterpret_cast<char *>(&audioFormat),
sizeof(unsigned short));
file.read(reinterpret_cast<char *>(&numChannels),
sizeof(unsigned short));
file.read(reinterpret_cast<char *>(&sampleRate),
sizeof(unsigned int));
file.read(reinterpret_cast<char *>(&byteRate),
sizeof(unsigned int));
file.read(reinterpret_cast<char *>(&blockAlign),
sizeof(unsigned short));
file.read(reinterpret_cast<char *>(&bitsPerSample),
sizeof(unsigned short));
do
{
file.read(subChunk2ID, WaveFormat::NUM_CHARS);
file.read(reinterpret_cast<char *>(&subChunk2Size),
sizeof(unsigned int));
data = new char[subChunk2Size];
file.read(reinterpret_cast<char *>(data), subChunk2Size);
}
while (strncmp(subChunk2ID, "data", 4) != 0);
file.close();
}
如果我在程序不再崩溃时注释掉do…。尝试在调试器配置中提高编译器优化级别,然后重新运行。重复上述步骤,直到得到相同的碰撞。希望优化器不会剥离和重新排序太多,以便更好地了解故障发生的位置。
data=new char[subChunk2Size]代码>在一个循环内,并且看不到解除分配。。。此示例中是否缺少相关内容?添加了我看到的标题文件。然而,如果你要这样做..当在那里循环时,它可能会运行不止一次。在这种情况下,您将泄漏使用data=newchar[subChunk2Size]分配的所有字符数组代码>而不是上次迭代中的代码。并不是说这会导致segfault,但无论如何,这是一个坏bug。即使是从发布版本中获得stacktrace也很好。。。或者试试valgrind,看看它能告诉你什么检查所有读取是否成功也不是一个坏主意。如何从发布版本获取stacktrace?
struct WaveFormat
{
public:
static const unsigned short NUM_CHARS = 4;
public:
WaveFormat() : data(nullptr) {
}
~WaveFormat() {
delete[] data;
}
void Load(std::string filename);
char chunkID[NUM_CHARS];
unsigned int chunkSize;
char format[NUM_CHARS];
char subChunkID[NUM_CHARS];
unsigned int subChunkSize;
unsigned short audioFormat;
unsigned short numChannels;
unsigned int sampleRate;
unsigned int byteRate;
unsigned short blockAlign;
unsigned short bitsPerSample;
char subChunk2ID[NUM_CHARS];
unsigned int subChunk2Size;
char* data;
};