[英]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
不复存在了。 它被摧毁了。 它是一个前参数。 一旦函数调用返回,函数调用的所有参数都会被销毁。 这个保存的指针现在指向一个不再存在的已销毁对象(请记住, we
是we
实际来源的副本)。
随后尝试取消引用此指针会导致尝试访问已销毁的对象。 那是你未定义的行为,然后崩溃。
在你的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.