如何将堆分配的std::vector<DPoint*>转为栈上的vector of vectors
代码修改方案
原代码依赖堆分配的指针容器,需要手动管理内存,容易引发泄漏。改成栈存储的对象容器后,无需手动维护内存,更安全高效。
基础实现版本
// 直接声明栈上的vector,存储DPoint对象而非指针 std::vector<DPoint> pixelSpacing; // 预分配空间,避免多次扩容提升性能 pixelSpacing.reserve(volume.pixelSpacing->size()); for (unsigned int i = 0; i < volume.pixelSpacing->size(); ++i) { // 直接拷贝原指针指向的DPoint对象到新vector pixelSpacing.push_back(*(*volume.pixelSpacing)[i]); }
简洁遍历版本(C++11及以上)
std::vector<DPoint> pixelSpacing; pixelSpacing.reserve(volume.pixelSpacing->size()); // 范围for遍历原指针容器,解引用拷贝对象 for (const auto* dpoint_ptr : *volume.pixelSpacing) { pixelSpacing.push_back(*dpoint_ptr); }
标准库算法实现版本(C++11及以上)
#include <algorithm> #include <iterator> std::vector<DPoint> pixelSpacing; pixelSpacing.reserve(volume.pixelSpacing->size()); // 使用std::transform批量拷贝对象 std::transform(volume.pixelSpacing->begin(), volume.pixelSpacing->end(), std::back_inserter(pixelSpacing), [](const DPoint* ptr) { return *ptr; });
关键修改说明
- 移除所有堆分配操作:不再用
new创建vector或DPoint对象,容器和元素均为自动存储期(栈存储),自动释放内存 - 容器类型从
std::vector<DPoint*>*改为std::vector<DPoint>,直接存储DPoint对象,避免指针管理的风险 - 添加
reserve预分配空间,减少vector扩容带来的性能开销
内容的提问来源于stack exchange,提问作者Andre Ahmed
相关产品推荐
相关产品推荐

