使用DELETE来节省内存,可以有人证明

时间:2011-03-29 19:15:28

标签: c++ memory

我正在学习C ++,对于以下代码,如果我不删除* p,我不知道会有多少内存。

#include <iostream>
using namespace std;

int *getPtrToFive()
{
    int *x = new int;
    *x = 5;
    return x;
}


int main()
{
    int *p = getPtrToFive();
    cout << *p << endl;
    delete p; // ?????????????
}

我如何验证或演示它。我正在使用Visual Studio 2008 Express。希望我的IDE可以立即显示结果。

干杯,

5 个答案:

答案 0 :(得分:8)

考虑到在调试模式下基于Visual C ++ 2010构建的以下示例,它将是 4 字节泄漏。如果发现泄漏,CRT能够倾倒泄漏。 (即,不从免费商店取消分配所获得的资源)

#define _CRTDBG_MAP_ALLOC

#include <crtdbg.h>

int main()
{

    int *rawPtr = new int(100) ;
    // Purposefully not deallocating the rawPtr owned resources from free store
    _CrtDumpMemoryLeaks() ;
    return 0;

}

输出:

  

...
  检测到内存泄漏!
  倾倒物体 - &gt;
  {56}正常阻塞位于0x006C3250,长度为4个字节   数据:&lt; 2&gt; 32 00 00 00
  对象转储完成。
  程序'[6160] memoryLeaks.exe:Native'已退出,代码为0(0x0)。


使用std::auto_ptr处理原始指针。如果它们超出范围,它们就能够有效地释放所拥有的资源。

例如:

void foo()
{

     int *rawPtr = new int(100) ;
     std::auto_ptr<int> safePtr(rawPtr) ;
     // Now no need to use delete statement

} // safePtr out of scope => deallocates the resource it owned safely
  // No memory leak

答案 1 :(得分:4)

由于以下原因,此计划不会像您希望的那样具有示范性。当你编程终止时(也就是说,当“main”函数返回时)程序使用的所有内存,无论是在堆还是堆栈上分配,都将返回给操作系统。

因此,虽然技术上确实你的程序在相应的“新”之后没有执行“删除”而泄漏内存,但是该内存仅在程序的生命周期中泄露,这在本例中不是很长。

答案 2 :(得分:3)

这是一个奇怪的问题。

在这种情况下,它是一个int,所以通过不清理它,你可能会浪费4个字节的内存加上操作系统的任何开销。如果您正在运行高性能应用程序或游戏,则不希望每帧都不断丢失内存,也称为内存泄漏。

如果它是一个简单的应用程序,你没有连续分配内存,那就不是太大的问题,因为当你的程序关闭时你的操作系统应该清理程序内存。再一次,只是不要以恒定的速率泄漏内存,我认为你应该没问题。

答案 3 :(得分:1)

MSDN上有一篇关于在非MFC程序中查找内存泄漏的文章:Finding Memory Leaks Using the CRT Library

具体而言,您的程序泄漏4个字节,如VC ++ sizeof(int) == 4

答案 4 :(得分:0)

这有两个部分:

  1. 在这个应用程序中,你不会浪费任何内存,因为一旦你的应用程序终止,在main完成之后所有的内存都被操作系统清理掉 - 所以实际上没有真正的泄漏。

  2. 假设应用程序有更多内容,您泄漏的内存量取决于您使用new分配的内存量,而int这种情况是int的大小是什么平台。