我正在学习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可以立即显示结果。
干杯,
答案 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)
具体而言,您的程序泄漏4个字节,如VC ++ sizeof(int) == 4
。
答案 4 :(得分:0)
这有两个部分:
在这个应用程序中,你不会浪费任何内存,因为一旦你的应用程序终止,在main完成之后所有的内存都被操作系统清理掉 - 所以实际上没有真正的泄漏。
假设应用程序有更多内容,您泄漏的内存量取决于您使用new分配的内存量,而int这种情况是int的大小是什么平台。