2017-04-04 59 views
0

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

#include <iostream> 
#include <cstring> 

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

     i++; 
    } 
} 

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

+3

请定义*“似乎不起作用”* – WhiZTiM

+0

检查您的进程内存。它会随着循环而增加 –

+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; 
} 

希望这会有所帮助,祝你好运在你的类!

0

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

就像现在一样,内存膨胀得非常快,直到你用完分配内存。

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