Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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++ 非常简单的程序通过VS2010 c++;内存泄漏检查器,但在销毁所有对象后仍会在程序结束时使用更多内存?_C++_Arrays_Memory_Stl_Memory Leaks - Fatal编程技术网

C++ 非常简单的程序通过VS2010 c++;内存泄漏检查器,但在销毁所有对象后仍会在程序结束时使用更多内存?

C++ 非常简单的程序通过VS2010 c++;内存泄漏检查器,但在销毁所有对象后仍会在程序结束时使用更多内存?,c++,arrays,memory,stl,memory-leaks,C++,Arrays,Memory,Stl,Memory Leaks,我在一个大型项目中遇到了内存泄漏的问题,但根据VS2010内存检查器,该项目没有内存泄漏(我已经全面检查了所有内容) 我决定编写一个简单的测试程序,看看泄漏是否会在较小的范围内发生 struct TestStruct { std::string x[100]; }; class TestClass { public: std::vector<TestStruct*> testA; //TestStruct** testA; TestStruct xxx[100]; TestC

我在一个大型项目中遇到了内存泄漏的问题,但根据VS2010内存检查器,该项目没有内存泄漏(我已经全面检查了所有内容)

我决定编写一个简单的测试程序,看看泄漏是否会在较小的范围内发生

struct TestStruct
{
    std::string x[100];
};
class TestClass
{
public:
std::vector<TestStruct*> testA;
//TestStruct** testA;
TestStruct xxx[100];
TestClass()
{
    testA.resize(100, NULL);
    //testA = new TestStruct*[100];
    for(unsigned int a = 0; a < 100; ++a)
    {
        testA[a] = new TestStruct;
    }
}
~TestClass()
{
    for(unsigned int a = 0; a < 100; ++a)
    {
        delete testA[a];
    }
    //delete [] testA;
    testA.clear();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    char inp;

    std::cin >> inp;
    {
        TestClass ttt[2];
        TestClass* bbbb = new TestClass[2];
        std::cin >> inp;
        delete [] bbbb;
    }
    std::cin >> inp;

    std::cin >> inp;
    return 0;
}
struct TestStruct
{
std::字符串x[100];
};
类TestClass
{
公众:
std::载体种皮;
//TestStruct**testA;
TestStruct xxx[100];
TestClass()
{
测试调整大小(100,空);
//testA=新的TestStruct*[100];
for(无符号整数a=0;a<100;++a)
{
testA[a]=新的TestStruct;
}
}
~TestClass()
{
for(无符号整数a=0;a<100;++a)
{
删除遗嘱[a];
}
//删除[]遗嘱;
testA.clear();
}
};
int _tmain(int argc,_TCHAR*argv[]
{
_CRTSETDBG标志(_CRTDBG_ALLOC_MEM_DF|u CRTDBG_LEAK_CHECK_DF);
char-inp;
标准:cin>>inp;
{
TestClass ttt[2];
TestClass*bbbb=新的TestClass[2];
标准:cin>>inp;
删除[]bbbb;
}
标准:cin>>inp;
标准:cin>>inp;
返回0;
}
使用这段代码,程序从大约1兆内存开始,上升到8兆以上,最后下降到1.5兆。额外的0.5兆欧到哪里去了?我在粒子系统中遇到了类似的问题,但规模达到数百兆字节

我一辈子都搞不清楚到底出了什么问题

顺便说一句,使用数组(我已经注释掉了)可以大大减少浪费的内存,但并不能完全减少它。我希望最后一次cin的内存使用与第一次相同

我正在使用任务管理器监视内存使用情况

谢谢。

“我一辈子都搞不清楚到底出了什么问题。”

可能没什么

“[程序]销毁所有对象后,在程序结束时仍会使用更多内存。”

您不应该真正关心程序端的内存使用情况。任何现代操作系统都关心在进程结束时“释放”与进程相关的所有内存。(从技术上讲,进程的地址空间是简单释放的。)

在程序结束时释放内存实际上会减慢程序的终止速度,因为它不必要地需要访问内存页,甚至可能位于交换空间上

额外的0.5MB可能仍保留在分配器中(malloc/free、new/delete、std::allocator)。这些分配器的工作方式通常是,必要时从操作系统请求内存,方便时将内存返回操作系统。碎片可能是分配器在某一时刻必须持有比严格要求更多内存的原因之一。由于从操作系统请求内存的速度很慢,因此保留一些内存通常也会更快

“我正在使用任务管理器监视内存使用情况。”

测量内存使用率实际上比观察单个数字更复杂,它需要对虚拟内存以及进程和操作系统之间的内存管理有很好的理解。不幸的是,我不能推荐任何适用于Windows的好工具

总的来说,我认为你的简单程序没有问题。

“我一辈子都搞不清楚到底出了什么问题。”

可能没什么

“[程序]销毁所有对象后,在程序结束时仍会使用更多内存。”

您不应该真正关心程序端的内存使用情况。任何现代操作系统都关心在进程结束时“释放”与进程相关的所有内存。(从技术上讲,进程的地址空间是简单释放的。)

在程序结束时释放内存实际上会减慢程序的终止速度,因为它不必要地需要访问内存页,甚至可能位于交换空间上

额外的0.5MB可能仍保留在分配器中(malloc/free、new/delete、std::allocator)。这些分配器的工作方式通常是,必要时从操作系统请求内存,方便时将内存返回操作系统。碎片可能是分配器在某一时刻必须持有比严格要求更多内存的原因之一。由于从操作系统请求内存的速度很慢,因此保留一些内存通常也会更快

“我正在使用任务管理器监视内存使用情况。”

测量内存使用率实际上比观察单个数字更复杂,它需要对虚拟内存以及进程和操作系统之间的内存管理有很好的理解。不幸的是,我不能推荐任何适用于Windows的好工具


总的来说,我认为您的简单程序没有问题。

您知道保留内存和提交内存之间的区别吗?@ildjarn不,我不知道。但是我可以从名字猜到,这个程序假设它会因为大量使用而需要一定数量的数据?这是否意味着程序实际上没有使用那么多内存?这取决于您在任务管理器中查看的列以及您正在运行的Windows版本。如果你想要一致且有意义的数字,你应该使用实际的内存分析器而不是任务管理器。我使用的是Windows 7 professional x64。下面是一个关于内存泄漏的推荐系列:它将帮助您了解内存的使用方式,并解释不同类型(保留、提交)的内存。您知道保留内存和提交内存之间的区别吗?@ildjarn不,我不知道。但是我可以从名字猜到,这个程序假设它会因为大量使用而需要一定数量的数据?这是否意味着程序实际上没有使用那么多内存?这取决于您在任务管理器中查看的列以及您运行的Windows版本