小编Min*_*n91的帖子

Android Soundpool.play() 在发布版本中不起作用

我正在尝试构建一个记录声音然后回放的应用程序。录音部分工作完美,但当我尝试重放声音时,它什么也没做。当我在调试器中运行它并逐步执行播放音频的步骤时,它可以工作。当我删除所有断点并在调试中运行程序时,它不会。

该问题可能是由在后台完成的一些事情引起的,并且在我尝试运行音频之前尚未完成,但我不完全确定。

任何帮助将不胜感激。

以下是源代码的相关部分。

创建声音池

mSoundPool = new SoundPool(16, AudioManager.STREAM_MUSIC, 0);
Run Code Online (Sandbox Code Playgroud)

从音池播放

int soundId = mSoundPool.load(mAudioRecorder.stop(), 0);
if(soundId > 0){
    mSoundPool.play(soundId, 0.99f, 0.99f, 0, -1, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)

Audiorecorder.java 输出文件是.mp4

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);


public String stop() throws IOException {
    mRecorder.stop();
    return mPath;
}
Run Code Online (Sandbox Code Playgroud)

debugging android release soundpool

4
推荐指数
1
解决办法
2637
查看次数

删除动态创建的对象

在我的应用程序中,我创建并返回一个数组,该数组填充了派生类中的动态分配对象,如下所示:

void someGetter(std:vector<DerivedClass> & returnV)
{
    BaseClass* base = object->clone();  // "object" is a "unique_ptr<BaseClass>"

    DerivedClass* derived = dynamic_cast<DerivedClass*> (base);

    if (derived != nullptr)
    {
        returnV.push_back(*derived);
    }
    else
    {
        delete base;
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然会造成内存泄漏(valgrinds在这里帮助我)因为派生从未被删除.

我试图像这样释放分配的内存:

delete &returnV[0];
Run Code Online (Sandbox Code Playgroud)

它没有给出任何编译错误/警告,代码仍然可以正常运行.但是valgrind在该行代码上报告了一些额外的错误(无效读取,无效释放),并且泄漏仍然存在.

有没有办法释放这样返回的内存?或者我应该返回unique_ptr而不是对象?

c++ memory c++11

0
推荐指数
1
解决办法
1711
查看次数

标签 统计

android ×1

c++ ×1

c++11 ×1

debugging ×1

memory ×1

release ×1

soundpool ×1