如何正确使用delete关键字避免C++ vector指针的内存泄漏
解决vector<int*>的内存泄漏问题
你的代码里,vector存储的是通过new在堆上分配的int*指针。程序结束时,vector本身作为栈上对象会自动销毁,但它里面的指针指向的堆内存并没有被释放——这就是Valgrind检测到泄漏的原因。你之前的两个误区:
- 不是
delete指针就会“丢值”——只有当你还需要使用该指针指向的值时,释放后才会出问题,但程序退出前必须清理所有用new分配的内存,否则就会造成泄漏。 - 不能
delete整个vector,因为vector是在栈上创建的对象,不是用new分配的指针类型,delete仅用于释放堆上分配的指针对象。
修复方案1:手动释放剩余内存
在main函数的末尾,遍历vector里的每个指针,逐个调用delete释放内存:
int main() { // ... 原代码内容保持不变 ... cout << "After: "; print_vector(v); // 新增:释放vector中剩余所有指针指向的堆内存 for (int* ptr : v) { delete ptr; } return 0; }
这样就能把所有用new分配的内存都清理干净,Valgrind就不会再报内存泄漏了。
修复方案2:使用智能指针(更省心,推荐)
C++11及以后标准提供的std::unique_ptr智能指针,会自动管理内存:当智能指针被销毁(比如vector销毁、元素被删除)时,会自动释放对应的堆内存,完全不需要手动调用delete。
修改后的完整代码:
#include<bits/stdc++.h> #include<memory> // 必须包含智能指针的头文件 using namespace std; void insert_element(vector<unique_ptr<int>>& v, int i) { int a; cin >> a; // 用make_unique创建智能指针,替代手动new v[i] = make_unique<int>(a); } void print_vector(vector<unique_ptr<int>>& v) { for (int i = 0; i < v.size(); i++) { // 访问方式和普通指针完全一致 cout << *(v[i]) << " "; } cout << endl; } void delete_element(vector<unique_ptr<int>>& v, int pos) { if (pos <= 0 || pos > v.size()) return; pos = pos - 1; // 无需手动delete,erase时智能指针会自动释放内存 v.erase(v.begin() + pos); } int main() { cout << "Enter size of vector: "; int n; cin >> n; vector<unique_ptr<int>> v(n); cout << "Enter elements of vector: "; for (int i = 0; i < n; i++) { insert_element(v, i); } cout << "Before: "; print_vector(v); cout << "Enter position to remove: "; int pos; cin >> pos; delete_element(v, pos); cout << "After: "; print_vector(v); // 无需手动清理,程序结束时自动释放所有内存 return 0; }
这个方案从根源上避免了手动管理内存的麻烦,更符合现代C++的编程习惯,也能彻底杜绝这类内存泄漏问题。
内容的提问来源于stack exchange,提问作者RJ89
相关产品推荐
相关产品推荐

