c ++中的内存泄漏

时间:2017-04-04 08:08:51

标签: c++ memory-leaks

我正在上c ++课程,我需要编写一个故意泄漏内存的简单程序。我通过创建new char []而不删除它们来尝试这个,但这似乎不起作用。以下是我尝试的完整代码。

#include <iostream> 
#include <cstring>

int main()
{
    int i=1;
    while (i<1000){
        char *data = new char [100000000];
        *data = 15;

        i++;
    }
}

当我观察程序的内存使用情况时,它不会增长,因此它不会泄漏任何内存。我刚收到错误的分配错误。

2 个答案:

答案 0 :(得分:2)

我认为最简单的内存泄漏情况是动态创建一个对象,然后立即丢失对它的引用。在这个简短的示例中,您将立即丢失对您创建的变量的引用,从而导致内存泄漏。像这样的小型设计程序中的内存泄漏使得很难理解内存泄漏,因为一旦程序退出,操作系统就会回收程序分配的内存。

程序运行很长一段时间后问题变得严重。内存泄漏加剧,计算机性能明显受到阻碍。

示例:

#include <iostream>

// Object is being created, allocated on the heap then function immediately exits, losing any reference to the object. This is a memory leak
void createObject()
{
    int* x = new int;
}

int prompt()
{
    int response;    
    std::cout << "Run again?\n";
    std::cin >> response;

    return response;
}
int main()
{
    while(continue)
    {
        createObject();

        // Running the program again and again will exacerbate the memory leak.
        continue = prompt();
    }

    return 0;
}

在这个人为的,无用的例子中保留对象引用的正确方法:

int* createObject()
{
    int* x = new int;

    return x;
}

int main()
{
    // Pointer to the object created in the function in this scope is created, so we still have access to the variable.
    int* a = createObject();

    return 0;
}

希望这会有所帮助,祝你班上好运!

答案 1 :(得分:0)

如果你在循环中加入一些延迟,你将能够看到内存增长。 您可以使用睡眠或等待用户输入。

就像现在一样,内存膨胀得如此之快,直到用完分配内存为止。

这不是内存泄漏的经典测试。 在程序结束时测试的内存泄漏是否释放了所有内存。