【问题标题】:Declare a pointer in a class but initialize in another thread在一个类中声明一个指针,但在另一个线程中初始化
【发布时间】:2023-04-02 14:25:01
【问题描述】:

我在主类中声明了一个名为 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 指针未初始化!

【问题讨论】:

  • 为什么是双指针?
  • 因为我想让webm指向download_webm指针,并在run函数中初始化download_webm

标签: c++ qt pointers memory


【解决方案1】:
MyThread::MyThread(DownloadWebm* we)

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

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)

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2020-09-25
    • 2014-10-14
    • 2014-10-24
    • 2022-06-10
    • 1970-01-01
    • 2013-04-26
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多