Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++内存泄漏_C++ - Fatal编程技术网

C++内存泄漏

C++内存泄漏,c++,C++,我有一个C++98测试代码。这段代码构成了一个可怕的记忆湖。为什么? 释放指针后的内存消耗与释放前相同 #include <iostream> #include "string.h" using namespace std; void test(); int main() { test(); cout << "Freed" << endl; int input; cin >> input; cout

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

释放指针后的内存消耗与释放前相同。这不是指示性的,许多free的实现通常不会将内存返回操作系统,而是将其循环使用以供将来分配。请参阅。

释放指针后的内存消耗与释放前相同。这不是指示性的,许多free的实现通常不会将内存返回操作系统,而是将其循环使用以供将来分配。请参阅。

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

<>但是,当您分配大量内存时,甚至在一般情况下,每当分配内存时,应该考虑分配失败的情况:

    ...
    try {
        test();
    }
    catch(bad_alloc) {
        cerr << "No more memory !" <<endl; 
    }
    ...
发生在这里的异常引发的事实将导致代码在删除发生之前离开测试。因此,由于异常,您的内存将泄漏


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

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

<>但是,当您分配大量内存时,甚至在一般情况下,每当分配内存时,应该考虑分配失败的情况:

    ...
    try {
        test();
    }
    catch(bad_alloc) {
        cerr << "No more memory !" <<endl; 
    }
    ...
发生在这里的异常引发的事实将导致代码在删除发生之前离开测试。因此,由于异常,您的内存将泄漏


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

@JonnyHenly你说得对,但他以前用过strlen,所以如果有一个空终结者失踪,那已经太晚了-如何确定内存泄漏?注意,当使用DelET[]时,C++运行时不太可能将内存的单个块返回到系统。相反,它更可能保留它们,并在以后的内存请求中使用它们。应用程序内存消耗将始终增加,而不会减少。释放内存时唯一要做的事情是确保下一个malloc/new不必增加内存使用量。换句话说,您分配1mb并释放它,内存使用量将变为1mb。你再分配512k,你的内存分配不会改变。@JonnyHenly你是对的,但他以前使用strlen,所以如果缺少空终止符,那就太晚了-如何确定内存泄漏?注意,当使用DelET[]时,C++运行时不太可能将内存的单个块返回到系统。相反,它更可能保留它们,并在以后的内存请求中使用它们。应用程序内存消耗将始终增加,而不会减少。释放内存时唯一要做的事情是确保下一个malloc/new不必增加内存使用量。换句话说,您分配1mb并释放它,内存使用量将变为1mb。如果再分配512k,内存分配不会改变。我认为处理内存泄漏的最佳方法是将内存管理留给合适的容器,例如,使用std::vector。您的建议有效且更高效,但我想知道代码出现这种意外行为的原因。我认为处理内存泄漏的最佳方法是将内存管理留给合适的容器,例如,使用std::vector。您的建议是有效的,而且效率更高,但我想知道代码出现这种意外行为的原因。是的!!!在阅读了您的评论之后,我重写了代码,调用了2次测试方法。实际上,内存是在第二次调用时返回给操作系统的。这是一个很好的回答,只知道一个古老的盐海谢谢,是的!!!在阅读了您的评论之后,我重写了代码,调用了2次测试方法。实际上,内存是在第二次调用时返回给操作系统的。这是一个很好的回答,只知道一个古老的盐海谢谢