C ++ strcpy内存泄漏

时间:2015-05-22 22:23:45

标签: c++

我有一个C ++ 98测试代码。这段代码成了一个可怕的记忆湖。为什么? 指针发布后的内存消耗与发布前相同。

#include <iostream>
#include "string.h"


using namespace std;

void test();

int main() {
    test();
    cout << "Freed" << endl;
    int input;
    cin >> input;
    cout << "Good bye" << endl;
    return 0;
}

void test() {
    int input;
    int count = 40000000;
    const char *str = "9 770123456789123456123";
    char **pMsg = new char *[count];
    cout << "Register: " << count << endl;
    cin >> input;
    for (int i = 0; i < count; i++) {
        pMsg[i] = new char[strlen(str) + 1];
        strcpy(pMsg[i], str);
    }
    cout << "Full pointers" << endl;
    cin >> input;

    for (int i = 0; i < count; i++) {
        delete[] pMsg[i];
    }
    delete[] pMsg;
}

2 个答案:

答案 0 :(得分:3)

原则上你的记忆不会泄漏,因为你delete[]new[] ... try { test(); } catch(bad_alloc) { cerr << "No more memory !" <<endl; } ...

但是当你分配大量内存时(甚至一般来说,每当你分配内存时),你应该考虑分配失败的情况:

test()

引发异常(此处发生)的事实将导致代码在删除发生之前离开div.SelectSingleNode(".//div[@class='entry-content']/p[1]/a/img").Attributes["src"].Value; 。所以由于例外,你的记忆力会泄漏。

备注: 避免此类内存泄漏的最佳方法是使用RAII惯用法:只在对象内部进行内存分配,并释放对象析构函数中的内存。由于所有超出范围的对象都将被删除,这将确保始终发生内存释放,即使出现异常也是如此。

答案 1 :(得分:1)

&#34;指针发布后的内存消耗与发布之前的内存相同&#34;。这不是指示性的,free的许多实现通常不会将内存返回给操作系统,而是“#34; recycle&#34;它用于未来的分配。请参阅this question