在JNI .cpp文件中,我有一個帶有SoundTouch *的結構(SoundTouch是一個C++音頻處理,我將其用於Android項目中),並初始化該結構作爲全局對象這樣的向量:將全局對象初始化爲指針是成功的唯一方法
struct SoundTouchExt
{
SoundTouch* sTouch;
queue<signed char>* fBufferOut;
int channels;
int sampleRate;
float tempoChange;
int pitchSemi;
int bytesPerSample;
SoundTouchExt()
{
sTouch = new SoundTouch();
fBufferOut = new queue<signed char>();
}
};
const int MAX_TRACKS = 16;
vector<SoundTouchExt> sProcessors(MAX_TRACKS);
這工作,至少如果我只用SoundTouchExt的一個在我的程序在同一時間對象(也就是那種一個不同的故事,但可能與 - 在播放多個實例時會導致輸出失真)。
但是,如果我宣佈它像這樣SoundTouch sTouch;
,註釋掉new
並相應地改變它的使用(->
到.
),指針引用,我編譯罰款,但我得到一個故障11(賽格故障)儘快當程序嘗試使用該對象時。
這裏的地方出現這種情況:
...
SoundTouchExt& soundTouch = sProcessors.at(track);
setup(soundTouch, channels, samplingRate, bytesPerSample, tempo, pitchSemi);
}
static void setup(SoundTouchExt& soundTouch, int channels, int sampleRate, int bytesPerSample, float tempoChange, float pitchSemi)
{
SoundTouch& sTouch = soundTouch.sTouch;
soundTouch.channels = channels;
soundTouch.sampleRate = sampleRate;
soundTouch.bytesPerSample = bytesPerSample;
soundTouch.tempoChange = tempoChange;
soundTouch.pitchSemi = pitchSemi;
sTouch.setSampleRate(sampleRate);
sTouch.setChannels(channels);
...
}
一個小小的研究,我想這可能是static intialization order fiasco的一個實例。我沒有在庫源代碼中看到任何全局變量,但我對C++知之甚少,無法知道還有什麼其他要查找的東西。
我的觀察對圖書館有什麼建議(或者我沒有正確地做某件事)?
確實,我當然不打算指向一個SoundTouch實例。你幾乎完美地把所有東西都打在了頭上,謝謝。 –