MyThread::MyThread(DownloadWebm* we)
we
- это параметр этой функции, а именно конструктор потока. По умолчанию параметры функции передаются по значению . Откуда бы ни пришло we
, фактически это we
является его копией. Вот что это за we
. Копия исходного значения, которое передается в эту функцию. Полностью независим от значения, указанного в вызове функции, который вызывает это.
webm = &we;
Указатель на we
сохраняется. Сразу после этого конструктор возвращается. we
больше не существует. Это разрушается. Это бывший параметр. Как только вызов функции возвращается, все параметры вызова функции уничтожаются. Этот сохраненный указатель теперь указывает на уничтоженный объект, который больше не существует (помните, что we
является копией того, из чего we
фактически поступил).
Последующие попытки разыменовать этот указатель приводят к попытке доступа разрушенный объект. Это ваше неопределенное поведение, и cra sh.
В вашем main()
:
MyThread *DownloadWebm_Thread = new MyThread(download_webm);
download_webm
указатель неинициализирован, поэтому передача его копии в конструктор неопределенное поведение, а также. Для конструктора логически невозможно получить доступ к download_webm
, поскольку его параметр является независимой копией этого неинициализированного указателя.
Вы можете передать указатель на download_webm
вместо этого:
MyThread *DownloadWebm_Thread = new MyThread(&download_webm);
И объявление и код конструктора корректируются соответствующим образом.
Вы также можете передать ссылку на download_webm
, которая будет более похожа на C ++, если вы ш sh. В этом случае параметр конструктора должен быть объявлен как ссылка на указатель:
MyThread::MyThread(DownloadWebm *&we)
При этом остальная часть существующего кода в основном остается неизменной, в этом случае.