STL и memory leaking detection в MSVS.NET
От: Аноним  
Дата: 05.03.05 19:02
Оценка:
Здравствуйте!
вопрос такой:

#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"??

спасибо!
Re: STL и memory leaking detection в MSVS.NET
От: Elich  
Дата: 05.03.05 19:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!

А>вопрос такой:

А>
А>#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"??

А>спасибо!


А какой выдает?
Re[2]: STL и memory leaking detection в MSVS.NET
От: Аноним  
Дата: 05.03.05 20:04
Оценка:
Здравствуйте, Elich, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


{skip}

E>А какой выдает?


а ничего не выдает, буд-то так надо...
Re: STL и memory leaking detection в MSVS.NET
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 06.03.05 05:14
Оценка: -1
Здравствуйте, <Аноним>, Вы писали:

А>вопрос такой:


А>
А>#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.
Re[2]: STL и memory leaking detection в MSVS.NET
От: Аноним  
Дата: 06.03.05 08:16
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

спасибо
Re[2]: STL и memory leaking detection в MSVS.NET
От: DmitryShm Россия  
Дата: 14.08.09 11:09
Оценка:
Здравствуйте, 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>

но, во-первых, не во всех проектах можно так вот "поменять местами", во-вторых, это показывает, что прием не совместим со стандартной библиотекой, а в третьих показывает, что если удастся скомпилировать, то поиск не будет вестись в коде стандартной библиотеки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.