【发布时间】:2010-03-09 09:01:51
【问题描述】:
在一次软件会议上进行讨论后,我着手确定删除具有纯 delete 的动态分配的原始数组是否会导致内存泄漏。
我编写了这个小程序,并在 windows XP 上运行 Visual Studio 2008 编译它:
#include "stdafx.h"
#include "Windows.h"
const unsigned long BLOCK_SIZE = 1024*100000;
int _tmain()
{
for (unsigned int i =0; i < 1024*1000; i++)
{
int* p = new int[1024*100000];
for (int j =0;j<BLOCK_SIZE;j++) p[j]= j % 2;
Sleep(1000);
delete p;
}
}
然后我使用任务管理器监控我的应用程序的内存消耗,令人惊讶的是内存被正确分配和释放,分配的内存并没有像预期的那样稳定增加
我已经修改了我的测试程序来分配一个非原始类型数组:
#include "stdafx.h"
#include "Windows.h"
struct aStruct
{
aStruct() : i(1), j(0) {}
int i;
char j;
} NonePrimitive;
const unsigned long BLOCK_SIZE = 1024*100000;
int _tmain()
{
for (unsigned int i =0; i < 1024*100000; i++)
{
aStruct* p = new aStruct[1024*100000];
Sleep(1000);
delete p;
}
}
运行 10 分钟后内存没有明显增加
我编译了警告级别为 4 的项目,但没有收到任何警告。
Visual Studio 运行时是否有可能跟踪分配的对象类型,因此在该环境中 delete 和 delete[] 之间没有区别?
【问题讨论】:
-
@Philip Potter:不是那个问题——那个问题是专门关于导致内存泄漏的。在这种情况下,内存泄漏并不典型。
-
尝试使用
shared_ptr<int>数组,每个数组指向不同的分配 int,您将看到您的实现是否使delete和delete[]等效。 C++ 对人们知道是错误的东西的迷恋总是在标准中明确指出是错误的,但似乎有时它们可能只是碰巧起作用;-) -
@Steve Jessop:unfurtinalty 它让人们在使用参数时看起来很愚蠢:“它在标准中未定义,因此不应该使用”。 MS 在执行标准时放宽规则的习惯导致开发人员在编写无投诉代码时会产生错误的安全感/
-
更不用说地球上没有开发人员可以证明这种说法是正确的,“啊,是的,我完全理解
delete和delete[]之间的区别,但是对于仅 MSVC 中的 POD 类型的数组代码,我故意巧妙地使用delete,作为节省输入两个额外字符的优化”。不,你没有,你只是忘记了。承认错误,纠正错误,不要再浪费时间争论了 ;-)
标签: c++ memory-management