读取C+中的wav文件+;仅在发布时崩溃(在调试时工作正常) 我正在读C++中的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

我收到以下错误消息:

对象0x7fc7b3d2b1f8错误:已释放对象的校验和不正确-对象可能在被释放后被修改。“或”分段错误:11`

在调试模式下运行程序时,它可以读取和播放wav文件

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;
};