繁体   English   中英

C ++ strcpy内存泄漏

[英]C++ strcpy memory leak

我有一个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;
}

原则上,您的内存不会泄漏,因为每个new[]前都有一个delete[] new[]

但是,当您分配大量内存时(甚至通常在任何时候分配内存时),都应考虑分配失败的情况:

    ...
    try {
        test();
    }
    catch(bad_alloc) {
        cerr << "No more memory !" <<endl; 
    }
    ...

引发异常(在此处发生)的事实将导致您的代码在删除发生之前离开test() 因此,由于异常,您的内存将泄漏。

备注: 避免此类内存泄漏的最佳方法是使用RAII惯用语:仅在对象内部进行内存分配,然后释放对象的析构函数中的内存。 由于所有超出范围的对象都将被删除,因此即使在发生异常的情况下,也可以确保始终进行内存争夺。

“释放指针之后的内存消耗与释放之前相同”。 这不是指示性的,许多free实现通常不会将内存返回给OS,而是“回收”它以供将来分配。 看到这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM