C++如何删除数组内类指针指向的对象并将对应数组元素置为nullptr
正确实现方法
对于存储裸指针的std::vector,删除指定下标对应实例并置空指针的标准写法如下:
void delete_and_nullify(size_t index, std::vector<x*>& arr) { // 先校验下标合法性,避免越界访问 if (index >= arr.size()) return; // 删除堆实例,delete空指针是合法操作,不会报错 delete arr[index]; // 置空对应位置的指针 arr[index] = nullptr; }
你可以在thing函数里直接调用这个逻辑,或者直接写对应的操作:
void thing() { xptrarray.push_back(xptr); // 执行删除+置空操作 delete xptrarray[0]; xptrarray[0] = nullptr; // 注意:类成员变量xptr此时是野指针,需要同步置空 xptr = nullptr; }
操作失败的原因
- 变量名拼写错误:你尝试的临时指针方案里,定义的临时变量是
tempPixelPtr,但是删除时写的是tempPtr,属于未定义变量,编译逻辑本身就不成立,自然无法完成删除。如果修正变量名,这个逻辑本身是合法的。 - 关键字拼写错误:你把空指针关键字
nullptr拼成了nullptrr,属于语法错误,赋值操作本身无效,指针没有被置空自然还能访问到原地址。 - 多指针持有同一块内存未同步处理:你的类成员
xptr和vector里存储的指针指向同一块堆内存,你只修改了vector里的指针,没有同步修改xptr成员,后续如果通过xptr访问内存,就是野指针访问,属于未定义行为,可能出现“实例还存在、代码还能运行”的假象。 - 访问违例的常见诱因:赋值
xptrarray[0] = nullptr时报访问错误,大概率是你操作的下标超出了vector的实际大小,属于越界访问;或者当前的y类实例本身是已经被释放的野对象,访问其成员vector时触发非法访问。
优化建议
优先使用智能指针管理堆内存,可以完全避免手动管理内存的各种错误,示例如下:
#include <memory> class x { //stuff }; class y { std::unique_ptr<x> xptr = std::make_unique<x>(); std::vector<std::unique_ptr<x>> xptrarray; void thing() { xptrarray.push_back(std::move(xptr)); // 直接调用reset即可自动释放内存并置空 xptrarray[0].reset(); } };
内容的提问来源于stack exchange,提问作者shinobiabuzittin
相关产品推荐
相关产品推荐

