使用循环创建结构体Vec时遇临时值提前释放错误求助
解决Rust中"temporary value dropped while borrowed"错误
错误原因
你的代码里,valid_transactions.push(&transaction.clone())这一行是问题核心:
transaction.clone()会生成一个临时的Transaction实例,你取这个临时实例的引用存入向量。- 临时实例在当前语句执行完毕后就会被Rust自动销毁,导致向量里的引用变成悬垂引用,这违反了Rust的安全规则,因此编译报错。
- 就算你在循环内用变量存储clone结果,只要存的还是引用,循环结束后该变量会被销毁,引用依然无效。
修复方案
让valid_transactions存储Transaction的所有权实例,而非引用。直接将克隆后的实例存入向量,不需要取引用:
fn main() { let mut valid_transactions = Vec::new(); let mut transaction_pool = TransactionPool::new(); // 假设state、recipient、amount已提前定义 let state = /* 你的State实例 */; let recipient = /* 你的recipient值 */; let amount = /* 你的amount值 */; for i in 0..10 { let mut transaction = Transaction::new(&state, &recipient, amount); if i % 3 == 0 { // 修正原代码的判断条件,用循环变量i而非固定值1 // 篡改输入金额使交易无效 transaction.input.amount = 999999.9; } else if i % 3 == 1 { // 篡改签名使交易无效 transaction.input.signature = Wallet::new(&state.secp).sign(&state, &mut vec!["wrong data".to_string()]); } else { // 直接存入克隆后的实例,而非引用 valid_transactions.push(transaction.clone()); } transaction_pool.set_transaction(&transaction.clone()); } assert_eq!( valid_transactions, transaction_pool.valid_transactions(&state) ); }
额外修正
原代码中判断条件用了固定值1 % 3,这会导致循环所有迭代都走同一个分支,改成i % 3才能实现每3次迭代分情况处理的逻辑。
内容的提问来源于stack exchange,提问作者Eric MacFarland
相关产品推荐
相关产品推荐

