use memtrack::track_mem;
use std::future::Future;
#[track_mem]
fn allocate_memory() {
let _data: Vec<u8> = vec![0; 1_000_000];
}
#[track_mem]
fn create_memory_leak() {
let mut data = vec![0u8; 5_000_000];
for i in 0..data.len() {
data[i] = (i % 255) as u8;
}
let boxed_data = Box::new(data);
Box::leak(boxed_data);
std::thread::sleep(std::time::Duration::from_millis(100));
}
struct Sleep {
duration: std::time::Duration,
}
impl Future for Sleep {
type Output = ();
fn poll(
self: std::pin::Pin<&mut Self>,
_cx: &mut std::task::Context<'_>,
) -> std::task::Poll<Self::Output> {
std::thread::sleep(self.duration);
std::task::Poll::Ready(())
}
}
#[track_mem]
async fn async_memory_leak() {
let mut data = vec![0u8; 5_000_000];
for i in 0..data.len() {
data[i] = (i % 255) as u8;
}
Sleep {
duration: std::time::Duration::from_millis(200),
}
.await;
let boxed_data = Box::new(data);
Box::leak(boxed_data);
std::thread::sleep(std::time::Duration::from_millis(100));
}
fn main() {
println!("\n=== MEMORY TRACKING DEMO ===");
println!("\n=== Testing normal allocation ===");
allocate_memory();
println!("=== Creating a memory leak ===");
create_memory_leak();
println!("\n=== Testing async allocation ===");
futures_executor::block_on(async_memory_leak());
println!("\n=== Demo completed ===");
}