繁体   English   中英

在类中声明指针但在另一个线程中初始化

[英]Declare a pointer in a class but initialize in another thread

我在主类中声明了一个名为 download_webm 的指针,我想在我的线程构造函数中初始化它,但每次我尝试这样做时,当我尝试连接下载 WebM 和播放器时程序崩溃。

int main(int argc, char *argv[])
{


    QApplication app(argc, argv);
    int x;

    DownloadWebm *download_webm;

    MyThread *DownloadWebm_Thread = new  MyThread(download_webm);



    DownloadWebm_Thread->start();


    LinuWebmPlayer *player = new LinuWebmPlayer(argv[1],0);
    QObject::connect(download_webm,SIGNAL(send_packege(Video_Bytes_Package)),player,SLOT(play()));
    player->show();





    return app.exec();
}

这是我的线程标题:

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <qthread.h>
#include <downloadwebm.h>
class MyThread : public QThread
{
    Q_OBJECT

public:
    MyThread(DownloadWebm *);
    MyThread();

protected:
    DownloadWebm **webm;
    void run();
};





#endif // MYTHREAD_H

, 和 CPP:

#include "mythread.h"

MyThread::MyThread()
{

}

MyThread::MyThread(DownloadWebm* we)
{
   webm = &we;
}

void MyThread::run()
{
   *webm = new DownloadWebm("http://trilulilu.de/recstreamingsource?movie=3860","asd");
}

主类将 download_webm 指针视为未初始化!

MyThread::MyThread(DownloadWebm* we)

we是这个函数的参数,即线程构造函数。 默认情况下,函数参数按值传递。 无论we来自哪里,实际上we都是它的副本。 这就是we 传递给此函数的原始值的副本。 完全独立于调用它的函数调用中指定的值。

webm = &we;

指向we的指针被保存。 紧接着构造函数返回。 we不复存在了。 它被摧毁了。 它是一个前参数。 一旦函数调用返回,函数调用的所有参数都会被销毁。 这个保存的指针现在指向一个不再存在的已销毁对象(请记住, wewe实际来源的副本)。

随后尝试取消引用此指针会导致尝试访问已销毁的对象。 那是你未定义的行为,然后崩溃。

在你的main()中:

MyThread *DownloadWebm_Thread = new  MyThread(download_webm);

download_webm是一个未初始化的指针,因此将它的副本传递给构造函数也是未定义的行为。 构造函数访问download_webm在逻辑上是不可能的,因为它的参数是这个未初始化指针的独立副本。

您可以将指针传递给download_webm ,而不是:

MyThread *DownloadWebm_Thread = new  MyThread(&download_webm);

并且构造函数的声明和代码得到相应的调整。

您还可以传递对download_webm的引用,如果您愿意,它会更像 C++。 在这种情况下,构造函数的参数必须声明为对指针的引用:

MyThread::MyThread(DownloadWebm *&we)

在这种情况下,现有代码的其余部分大部分保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM