当前位置:  开发笔记 > 编程语言 > 正文

是删除p其中p是指向数组的指针始终是内存泄漏吗?

如何解决《是删除p其中p是指向数组的指针始终是内存泄漏吗?》经验,为你挑选了2个好方法。

在软件会议中进行讨论之后,我已经着手查明是否删除带有plain的动态分配的primitives数组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

我比使用任务管理器监视我的应用程序的内存消耗,令人惊讶的是内存被正确分配和释放,分配的内存没有像预期的那样稳定增加

我修改了我的测试程序来分配一个非原始类型的数组:

#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编译了项目并没有收到任何警告.

视觉工作室运行时是否有可能跟踪分配的对象类型,以便在该环境之间delete和之间没有区别delete[]



1> Chris Becke..:

delete p,其中p是一个数组,称为未定义行为.

具体来说,当你分配一个原始数据类型(int)数组时,编译器没有很多工作要做,所以它把它变成一个简单的malloc(),所以delete p可能会起作用.

删除p通常会在以下情况下失败:

p是一个复杂的数据类型 - 删除p; 不会知道打电话给个人的析构函数.

"user"重载operator new []和delete []以使用不同的堆到常规堆.

调试运行时重载operator new []和delete []以添加数组的额外跟踪信息.

编译器决定它需要存储额外的RTTI信息以及删除p的对象; 不明白,但删​​除[] p; 将.



2> sharptooth..:

不,这是未定义的行为.不要这样做 - 使用delete[].

在VC++ 7到9中,当有问题的类型具有简单的析构函数时,它恰好可以工作,但它可能会停止处理更新的版本 - 通常具有未定义行为的东西.反正不要这样做.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有