You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:11:04