Bitmap *pic=new Bitmap(1024,768);
我用完之后完全不处理,退出程序也不提示所谓的内存泄漏
21 个解决方案
#1
程序都退出了,操作系统把你的进程资源都回收了,当然没问题了.这回收功能是操作系统的机制.
#2
Bitmap类似于智能指针,在析构函数中释放资源。
#3
是指GdiplusShutdown这个函数吗?在程序退出的时候调用它
#4
但是其他的类new后不delete就泄漏
#5
因为这个类和MFC的DEBUG_NEW不兼容,所以不会被MFC的内存分配器跟踪
#6
ls的有理
vc 不支持垃圾收集!
vc 不支持垃圾收集!
#7
呵呵,其实有的内存你是不用解放的,当你退出的时候他们就都消失了。
#8
消失?哪去了?
#9
应该怎么样跟踪并查出泄漏点
#10
你可以把GDI+自己封装一遍,你自己的类是可以被跟踪的
#11
我还没有牛到可以封装别人写的库
#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+对象都继承于此类
{
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
#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
#17
这不是用GDI+的通病么
#18
http://baike.baidu.com/view/264257.htm
#19
自己看1楼的代码
#20
GDI+new时,有#define new DEBUG_NEW报错。
#21
我也晕倒楼主同样的问题,一DELETE就报错,但是不DELETE又怕内存泄漏。不知道楼主对这个问题研究的咋样了?
#1
程序都退出了,操作系统把你的进程资源都回收了,当然没问题了.这回收功能是操作系统的机制.
#2
Bitmap类似于智能指针,在析构函数中释放资源。
#3
是指GdiplusShutdown这个函数吗?在程序退出的时候调用它
#4
但是其他的类new后不delete就泄漏
#5
因为这个类和MFC的DEBUG_NEW不兼容,所以不会被MFC的内存分配器跟踪
#6
ls的有理
vc 不支持垃圾收集!
vc 不支持垃圾收集!
#7
呵呵,其实有的内存你是不用解放的,当你退出的时候他们就都消失了。
#8
消失?哪去了?
#9
应该怎么样跟踪并查出泄漏点
#10
你可以把GDI+自己封装一遍,你自己的类是可以被跟踪的
#11
我还没有牛到可以封装别人写的库
#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+对象都继承于此类
{
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
#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
#17
这不是用GDI+的通病么
#18
http://baike.baidu.com/view/264257.htm
#19
自己看1楼的代码
#20
GDI+new时,有#define new DEBUG_NEW报错。
#21
我也晕倒楼主同样的问题,一DELETE就报错,但是不DELETE又怕内存泄漏。不知道楼主对这个问题研究的咋样了?