克隆新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
相关产品推荐
相关产品推荐

