C++ 在Qt应用程序中使用时出现奇怪的类行为
我有一个简单的类,包含这些,也是简单的构造函数:C++ 在Qt应用程序中使用时出现奇怪的类行为,c++,qt,C++,Qt,我有一个简单的类,包含这些,也是简单的构造函数: audio::audio() { channels = NULL; nChannels = 0; } audio::audio(const char* filename) { audio(); getFromFile(filename); } (在它是audio():channels(NULL),nChannles(0),loaded(false){…,我稍后会说为什么会更改…。函数getFromFile的
audio::audio() {
channels = NULL;
nChannels = 0;
}
audio::audio(const char* filename) {
audio();
getFromFile(filename);
}
(在它是audio():channels(NULL),nChannles(0),loaded(false){…
,我稍后会说为什么会更改…。函数getFromFile
的启动方式如下:
void audio::getFromFile(const char* filename) {
baseUtils::dynVec<float> *chans;
if (channels != NULL)
deleteChannels();
sox_format_t *in;
sox_sample_t buff[AUDIO_CLASS_READ_SAMPLES];
sox_sample_t sample;
...
它将具有
通道!=NULL
(在调用第二个构造函数之后),并尝试删除未分配的指针(导致分段错误).使用GDB,我发现频道设置为一些奇怪的值,并且通道也设置为的值…这闻起来像是一种竞争条件,但显然不是这样。我在插槽中放了一个检查,看看aud!=NULL
,以避免出现这种情况。你有什么想法吗?为什么会发生这种情况?我尝试使用Valgrind,它说在atchannels!=NULL
中,我正在尝试使用未初始化的值执行条件跳转!怎么可能?构造函数如何?问题在于audio::audio(const char*filename)
构造函数。第一条语句是audio()但是,C++不允许一个cTor调用另一个构造函数。因此,你有未初始化的指针。如果你想做这样的事情,写一个私有的方法,叫做<代码>()/代码>,并从两个构造函数调用它。<代码> Audio();< /Cord>语句创建临时的临时文件。(未命名)音频对象使用默认的ctor,该ctor在此语句之后立即被销毁。因此,在此之后访问的对象是另一个具有未初始化指针的对象。问题在于audio::audio(const char*filename)
构造函数。第一个语句是audio()但是,C++不允许一个cTor调用另一个构造函数。因此,你有未初始化的指针。如果你想做这样的事情,写一个私有的方法,叫做<代码>()/代码>,并从两个构造函数调用它。<代码> Audio();< /Cord>语句创建临时的临时文件。(未命名)使用默认ctor的音频对象,该ctor在此语句之后立即被销毁。因此,在此之后访问的对象是另一个具有未初始化指针的对象。audio();创建了一个对象,但由于您没有命名它,因此以后无法访问它。audio()
创建一个新的临时audio
对象,不将其存储在任何变量中(然后立即再次销毁)。您可以使用上面描述的init()方法,也可以对audio进行子类化,为其提供一个新的构造函数,并从新的构造函数中调用旧的构造函数,如下所示:childClass():baseClass(){//ctor logic here…我想我更喜欢init()方法。谢谢大家。很抱歉,我已经使用Java很长时间了。仍然有一些小问题saudio();创建了一个对象,但由于您没有命名它,您以后无法访问它。audio()
创建了一个新的临时audio
对象,没有将它存储在任何变量中您可以使用上面描述的init()方法,也可以对音频进行子类化,为其提供一个新的构造函数,并从新的构造函数中调用旧的构造函数,如下所示:childClass():baseClass(){//ctor logic here}……我想我更喜欢init()方法。谢谢大家。很抱歉,我已经使用Java很长时间了。仍然有一些小故障
void buttonPushed() {
QString s = QFileDialog::getOpenFileName();
std::cout << "file choosen: " << s.toStdString() << "\n";
sndfile = s.toStdString();
if (aud == NULL){
aud = new audio(sndfile.c_str());
ui.widget->setAudio(aud);
ui.widget->update();
}
[...]