Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt应用程序中使用时出现奇怪的类行为_C++_Qt - Fatal编程技术网

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,它说在at
channels!=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();
        }
[...]