You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用循环创建结构体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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:40:01