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

克隆新Tensor后内存地址未变化的原因分析(关联std::map操作)

问题分析:torch::Tensor克隆后内存地址未变化的原因?

相关C++代码

std::map<std::string, torch::Tensor*> tmpFloatActivations = model.getActivations();
std::map<std::string, torch::Tensor*> floatActivations;
floatActivations.insert(tmpFloatActivations.begin(), tmpFloatActivations.end());
for (auto& mapIter : tmpFloatActivations) {
     cout << "[DEBUG-BEFORE] layerName: " << mapIter.first << " address: " << (void*)mapIter.second << endl;
     torch::Tensor* clonedTensor = new torch::Tensor(mapIter.second->clone());
     floatActivations.insert(std::make_pair(mapIter.first, clonedTensor));
     cout << "[DEBUG-AFTER] layerName: " << mapIter.first << " address: " << (void*)floatActivations[mapIter.first] << endl;
}

现象说明

即便通过clone()创建新的torch::Tensor并插入floatActivations,打印的前后内存地址仍保持一致;但注释掉floatActivations.insert(tmpFloatActivations.begin(), tmpFloatActivations.end());这行代码后,前后地址就会不同。

原因解释

  • std::map的insert特性:初始调用floatActivations.insert(tmpFloatActivations.begin(), tmpFloatActivations.end())时,已经将tmpFloatActivations里所有键值对插入到floatActivations中。后续循环里再次调用insert插入同键的新指针时,因为键已存在,insert操作会直接失败,不会覆盖原有值。
  • operator[]的取值逻辑:打印时用floatActivations[mapIter.first]取到的是初始插入的旧指针(来自tmpFloatActivations的原始地址),所以前后地址一致。
  • 注释初始插入后的变化:如果去掉那行初始插入代码,floatActivations初始为空,循环里的insert会成功插入新的克隆指针,此时operator[]取到的就是新创建的clonedTensor地址,前后地址自然不同。

内容的提问来源于stack exchange,提问作者alryosha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:49:50