为什么GDI+中的Bitmap对象new了之后也不用delete,完全不理解

时间:2022-01-01 20:39:33
难道像C#那样有垃圾回收机制?只new不delete?

Bitmap *pic=new Bitmap(1024,768);
我用完之后完全不处理,退出程序也不提示所谓的内存泄漏

21 个解决方案

#1


程序都退出了,操作系统把你的进程资源都回收了,当然没问题了.这回收功能是操作系统的机制.

#2


Bitmap类似于智能指针,在析构函数中释放资源。

#3


引用 2 楼 saloyun 的回复:
Bitmap类似于智能指针,在析构函数中释放资源。

是指GdiplusShutdown这个函数吗?在程序退出的时候调用它

#4


引用 1 楼 ljljlj 的回复:
程序都退出了,操作系统把你的进程资源都回收了,当然没问题了.这回收功能是操作系统的机制.

但是其他的类new后不delete就泄漏

#5


因为这个类和MFC的DEBUG_NEW不兼容,所以不会被MFC的内存分配器跟踪

#6


ls的有理

vc 不支持垃圾收集!

#7


呵呵,其实有的内存你是不用解放的,当你退出的时候他们就都消失了。

#8


引用 7 楼 sadasasdasd 的回复:
呵呵,其实有的内存你是不用解放的,当你退出的时候他们就都消失了。

消失?哪去了?

#9


引用 5 楼 jiangsheng 的回复:
因为这个类和MFC的DEBUG_NEW不兼容,所以不会被MFC的内存分配器跟踪

应该怎么样跟踪并查出泄漏点

#10


你可以把GDI+自己封装一遍,你自己的类是可以被跟踪的

#11


引用 10 楼 jiangsheng 的回复:
你可以把GDI+自己封装一遍,你自己的类是可以被跟踪的

我还没有牛到可以封装别人写的库

#12


蒋大哥说的很清楚, gid+的对象有个叫类似于gidbase类,里面有operator new 和delete的重载, 所以你new 一个gdi+对象的时候用的是这个实现,而MFC在类向导产生的cpp文件一般都定义了 DEBUG_NEW,用于在内存分配时记录在此cpp文件内new的对象以达到检查内存泄漏的作用

#13


class GdiplusBase
{
public:
    void (operator delete)(void* in_pVoid)
    {
       DllExports::GdipFree(in_pVoid);
    }
    void* (operator new)(size_t in_size)
    {
       return DllExports::GdipAlloc(in_size);
    }
    void (operator delete[])(void* in_pVoid)
    {
       DllExports::GdipFree(in_pVoid);
    }
    void* (operator new[])(size_t in_size)
    {
       return DllExports::GdipAlloc(in_size);
    }
};

gid+对象都继承于此类

#14


引用 13 楼 jdzfjfhnui 的回复:
 




#define iterator _iterator

#ifdef _DEBUG

namespace Gdiplus
{
namespace DllExports
{
#include <GdiplusMem.h>
};

#ifndef _GDIPLUSBASE_H
#define _GDIPLUSBASE_H
class GdiplusBase
{
public:
void (operator delete)(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}

void* (operator new)(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}

void (operator delete[])(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}

void* (operator new[])(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}

void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine)
{
return DllExports::GdipAlloc(nSize);
}

void operator delete(void* p, LPCSTR lpszFileName, int nLine)
{
DllExports::GdipFree(p);
}

};
#endif // #ifndef _GDIPLUSBASE_H
}
#endif // #ifdef _DEBUG
--------------------
是不是指这个?
如果用你写的那个去new会提示
C2660:“Gdiplus::GdiplusBase::operator new” : 函数不接受3个参数 

#15


因为你的new被debug_new宏重新定义了啊, 唉, 你在cpp写new的时候就被deug_new的那段代码填了,那段代码是不是有三个参数, 大小,文件位置,文件名

#16


为什么GDI+中的Bitmap对象new了之后也不用delete,完全不理解

#17


引用 15 楼 jdzfjfhnui 的回复:
因为你的new被debug_new宏重新定义了啊, 唉, 你在cpp写new的时候就被deug_new的那段代码填了,那段代码是不是有三个参数, 大小,文件位置,文件名

这不是用GDI+的通病么

#18


http://baike.baidu.com/view/264257.htm

#19


引用 18 楼 jdzfjfhnui 的回复:
http://baike.baidu.com/view/264257.htm

自己看1楼的代码

#20


GDI+new时,有#define new DEBUG_NEW报错。

#21


我也晕倒楼主同样的问题,一DELETE就报错,但是不DELETE又怕内存泄漏。不知道楼主对这个问题研究的咋样了?

#1


程序都退出了,操作系统把你的进程资源都回收了,当然没问题了.这回收功能是操作系统的机制.

#2


Bitmap类似于智能指针,在析构函数中释放资源。

#3


引用 2 楼 saloyun 的回复:
Bitmap类似于智能指针,在析构函数中释放资源。

是指GdiplusShutdown这个函数吗?在程序退出的时候调用它

#4


引用 1 楼 ljljlj 的回复:
程序都退出了,操作系统把你的进程资源都回收了,当然没问题了.这回收功能是操作系统的机制.

但是其他的类new后不delete就泄漏

#5


因为这个类和MFC的DEBUG_NEW不兼容,所以不会被MFC的内存分配器跟踪

#6


ls的有理

vc 不支持垃圾收集!

#7


呵呵,其实有的内存你是不用解放的,当你退出的时候他们就都消失了。

#8


引用 7 楼 sadasasdasd 的回复:
呵呵,其实有的内存你是不用解放的,当你退出的时候他们就都消失了。

消失?哪去了?

#9


引用 5 楼 jiangsheng 的回复:
因为这个类和MFC的DEBUG_NEW不兼容,所以不会被MFC的内存分配器跟踪

应该怎么样跟踪并查出泄漏点

#10


你可以把GDI+自己封装一遍,你自己的类是可以被跟踪的

#11


引用 10 楼 jiangsheng 的回复:
你可以把GDI+自己封装一遍,你自己的类是可以被跟踪的

我还没有牛到可以封装别人写的库

#12


蒋大哥说的很清楚, gid+的对象有个叫类似于gidbase类,里面有operator new 和delete的重载, 所以你new 一个gdi+对象的时候用的是这个实现,而MFC在类向导产生的cpp文件一般都定义了 DEBUG_NEW,用于在内存分配时记录在此cpp文件内new的对象以达到检查内存泄漏的作用

#13


class GdiplusBase
{
public:
    void (operator delete)(void* in_pVoid)
    {
       DllExports::GdipFree(in_pVoid);
    }
    void* (operator new)(size_t in_size)
    {
       return DllExports::GdipAlloc(in_size);
    }
    void (operator delete[])(void* in_pVoid)
    {
       DllExports::GdipFree(in_pVoid);
    }
    void* (operator new[])(size_t in_size)
    {
       return DllExports::GdipAlloc(in_size);
    }
};

gid+对象都继承于此类

#14


引用 13 楼 jdzfjfhnui 的回复:
 




#define iterator _iterator

#ifdef _DEBUG

namespace Gdiplus
{
namespace DllExports
{
#include <GdiplusMem.h>
};

#ifndef _GDIPLUSBASE_H
#define _GDIPLUSBASE_H
class GdiplusBase
{
public:
void (operator delete)(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}

void* (operator new)(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}

void (operator delete[])(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}

void* (operator new[])(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}

void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine)
{
return DllExports::GdipAlloc(nSize);
}

void operator delete(void* p, LPCSTR lpszFileName, int nLine)
{
DllExports::GdipFree(p);
}

};
#endif // #ifndef _GDIPLUSBASE_H
}
#endif // #ifdef _DEBUG
--------------------
是不是指这个?
如果用你写的那个去new会提示
C2660:“Gdiplus::GdiplusBase::operator new” : 函数不接受3个参数 

#15


因为你的new被debug_new宏重新定义了啊, 唉, 你在cpp写new的时候就被deug_new的那段代码填了,那段代码是不是有三个参数, 大小,文件位置,文件名

#16


为什么GDI+中的Bitmap对象new了之后也不用delete,完全不理解

#17


引用 15 楼 jdzfjfhnui 的回复:
因为你的new被debug_new宏重新定义了啊, 唉, 你在cpp写new的时候就被deug_new的那段代码填了,那段代码是不是有三个参数, 大小,文件位置,文件名

这不是用GDI+的通病么

#18


http://baike.baidu.com/view/264257.htm

#19


引用 18 楼 jdzfjfhnui 的回复:
http://baike.baidu.com/view/264257.htm

自己看1楼的代码

#20


GDI+new时,有#define new DEBUG_NEW报错。

#21


我也晕倒楼主同样的问题,一DELETE就报错,但是不DELETE又怕内存泄漏。不知道楼主对这个问题研究的咋样了?