LINUX.ORG.RU

C++ адрес подменяется

 , ,


0

1

Продолжаю изучать с++

Process* ffplay = nullptr; //указатель в 0
ffplay = new Process("xxx"); //возвращается адрес  0x00000000003aa270 и заполняется память
ffplay->Start(); //тут запускается дочерний процес и также новый thread, который читает трубу процесса

delete ffplay; //освобождаю память
ffplay = nullptr; //указываю на адрес памяти 0x0000000000000000

//далее, в триде, проверяется что объект убит (это можно определить по свойствам объекта, например там id будет -12334214, а у созданого объекта 1..2..3...) и все поля либо NULL, ну в общем понятно. 

//трид успешно завершается, говорит что объект более не живучий и выхожу из цикла чтения. Ну либо когда труба закрыта

//стоит мне после этого создать новый объект на старый указатель
ffplay = new Process("xxx"); //тут снова 0x00000000003aa270

//то потом тред не завершается, потому что считает что объект все ещё живой. Это что получается, быстренько записали на старый адрес новые данные и тред даже не знает что ему подменили объект?

//если следом создать ещё один
Process *ffplay2 = new Process("xxx"); //тут адрес уже другой 0x000000000022d6b0


Как мне избежать такой подмены объекта в треде?

★★★★
Ответ на: комментарий от anonymous

Хорошо, что в rust такое не скомпилируется, это просто писец.

C unsafe скомпилируется.

monk ★★★★★
()
Ответ на: комментарий от anonymous

На rust и нормальный код не компилируется:

use std::thread;

fn main() {
    let v = vec![1, 2, 3];

    let handle = thread::spawn(|| {
        println!("Here's a vector: {:?}", v);
    });

    handle.join().unwrap();
    drop(v);
}

Он не понимает, что к моменту drop поток уже гарантированно завершился.

monk ★★★★★
()
Ответ на: комментарий от monk

Он не понимает, что к моменту drop поток уже гарантированно завершился.

В точке где вызывается drop(v); переменой v уже не существует, ты же передал владение v в лямбду.

anonymous
()
Ответ на: комментарий от anonymous

как там секта поживает? файрфокс уже доели или ещё что-то осталось?

anonymous
()
Ответ на: комментарий от monk

Rust ничего не может понимать. Оно не так работает. Там никакого статанализа. Всё это написано на unsafe и ничего не знает о контексте и окружени.

anonymous
()
Ответ на: комментарий от anonymous

В точке где вызывается drop(v); переменой v уже не существует, ты же передал владение v в лямбду.

Не передал, а на время отдал. Вот так работает:

fn main() {
    let v = vec![1, 2, 3];

    let handle = || {
        println!("Here's a vector: {:?}", v);
    };

    handle();
    drop(v);
}
monk ★★★★★
()
Ответ на: комментарий от anonymous

твоё мнение о говноязыке Rust тут не нужно. Это тред про Си++.

bonta ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.