C++如何向vector中添加array新实例而非原对象的引用
问题根源
- 你当前的
pinkys容器存储的是array<float, 3>类型的指针,所有插入操作都只是重复插入原始对象monster1的内存地址,没有生成独立的新数组实例 - 代码中定义的
temp是monster1的引用,本质上和原对象是同一块内存空间,取地址后还是指向原对象
方案1:保留指针存储,新增堆上独立实例
如果确实需要容器存储指针,可以为每个新实例在堆上分配独立内存,复制原对象的值:
array<float, 3> monster1 = { 10.5, 8.5, 1.0 }; vector<array<float, 3>*> pinkys = { &monster1 }; void duplicateGhosts() { int count = 0; int i = pinkys.size(); for (auto monster : pinkys) { if (count >= i) break; // 新建堆上实例,复制当前遍历到的monster的值,生成独立对象 array<float, 3>* newMonster = new array<float, 3>(*monster); pinkys.push_back(newMonster); count++; } }
注意:该方案需要你后续手动管理内存,在不需要
pinkys元素时遍历调用delete释放,避免内存泄漏,更推荐使用智能指针替换裸指针。
方案2(更推荐):容器直接存储对象,自动管理内存
不需要存指针的情况下,直接修改容器类型存储数组对象,插入时直接拷贝生成新实例,无需手动管理内存:
array<float, 3> monster1 = { 10.5, 8.5, 1.0 }; // 容器直接存储对象而非指针 vector<array<float, 3>> pinkys = { monster1 }; void duplicateGhosts() { int count = 0; int i = pinkys.size(); for (const auto& monster : pinkys) { if (count >= i) break; // 直接拷贝生成新的独立实例插入容器 pinkys.push_back(monster); count++; } }
这种方案下每个元素都是独立的对象,修改任意元素都不会影响其他实例,也不需要手动处理内存释放,安全性更高。
内容的提问来源于stack exchange,提问作者it's jayway
相关产品推荐
相关产品推荐

