Здравствуйте!
вопрос такой:
#include <valarray>
#include <iostream>
using std::valarray;
void main()
{
valarray<int>* arr = new valarray<int>(12,12);
for(int i = 0;i < 12; i++)
{
std::cout<<(*arr)[i]<<std::endl;
}
}
почему данный код при исполнении в дебаггере MSVS.NET не выдает предупреждений
"memory leaks detected"??
спасибо!
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте!
А>вопрос такой:
А>А>#include <valarray>
А>#include <iostream>
А>using std::valarray;
А>void main()
А>{
А> valarray<int>* arr = new valarray<int>(12,12);
А> for(int i = 0;i < 12; i++)
А> {
А> std::cout<<(*arr)[i]<<std::endl;
А> }
А>}
А>
А>почему данный код при исполнении в дебаггере MSVS.NET не выдает предупреждений
А>"memory leaks detected"??
А>спасибо!
А какой выдает?
Здравствуйте, Elich, Вы писали:
E>Здравствуйте, Аноним, Вы писали:
{skip}
E>А какой выдает?
а ничего не выдает, буд-то так надо...
Здравствуйте, <Аноним>, Вы писали:
А>вопрос такой:
А>А>#include <valarray>
А>#include <iostream>
А>using std::valarray;
А>void main()
А>{
А> valarray<int>* arr = new valarray<int>(12,12);
А> for(int i = 0;i < 12; i++)
А> {
А> std::cout<<(*arr)[i]<<std::endl;
А> }
А>}
А>
А>почему данный код при исполнении в дебаггере MSVS.NET не выдает предупреждений
А>"memory leaks detected"??
потому что ты об этом не попросил:
#include <valarray>
#include <iostream>
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
inline void* __cdecl operator new( size_t nSize, const char * pszFileName, int nLine )
{
return ::operator new( nSize, _NORMAL_BLOCK, pszFileName, nLine );
}
#define _DEBUG_NEW new(__FILE__, __LINE__)
#define new _DEBUG_NEW
#endif
using std::valarray;
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );
valarray<int>* arr = new valarray<int>(12,12);
for(int i = 0;i < 12; i++)
{
std::cout<<(*arr)[i]<<std::endl;
}
return 0;
}
Detected memory leaks!
Dumping objects ->
c:\program files\microsoft visual studio .net 2003\vc7\include\crtdbg.h(692) : {61} normal block at 0x00321038, 48 bytes long.
Data: < > 0C 00 00 00 0C 00 00 00 0C 00 00 00 0C 00 00 00
c:\projects\vc71\tests\memlick\memlick.cpp(27) : {60} normal block at 0x00320FF0, 12 bytes long.
Data: <8 2 > 38 10 32 00 0C 00 00 00 0C 00 00 00
Object dump complete.
Здравствуйте, Odi$$ey, Вы писали:
спасибо
Здравствуйте, Odi$$ey, Вы писали:
OE>потому что ты об этом не попросил:
OE>OE>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
OE>inline void* __cdecl operator new( size_t nSize, const char * pszFileName, int nLine )
OE>{
OE> return ::operator new( nSize, _NORMAL_BLOCK, pszFileName, nLine );
OE>}
OE>#define _DEBUG_NEW new(__FILE__, __LINE__)
OE>#define new _DEBUG_NEW
OE>#endif
OE>
Какой ценой предполагается отлов мемориликов? Неужели ценой морок с проектом, когда код после такого изменения может просто не компилироваться?
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <stdexcept>
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
inline void* __cdecl operator new( size_t nSize, const char * pszFileName, int nLine )
{
return ::operator new( nSize, _NORMAL_BLOCK, pszFileName, nLine );
}
#define _DEBUG_NEW new(__FILE__, __LINE__)
#define new _DEBUG_NEW
#endif
int main()
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
new int[10];
return 0;
}
Понятно, что все будет компилироваться после того, как мы поменяем местами
#include <stdexcept>
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
но, во-первых, не во всех проектах можно так вот "поменять местами", во-вторых, это показывает, что прием не совместим со стандартной библиотекой, а в третьих показывает, что если удастся скомпилировать, то поиск не будет вестись в коде стандартной библиотеки.