[fdo-users] Memory problem with ArcSDEProvider92.dll

Jackie Ng jumpinjackie at gmail.com
Sun May 31 22:26:55 EDT 2009


I see two things here:

1 - Is there any reason why you have written your own library loader? The
IConnectionManager already achieves this purpose of obtaining FdoIConnection
pointers. You can obtain a pointer to the IConnectionManager by using
FdoFeatureAccessManager::GetConnectionManager()

This code should let you obtain an ArcSDE connection pointer.

FdoPtr<IConnectionManager> connMgr =
FdoFeatureAccessManager::GetConnectionManager();
FdoPtr<FdoIConnection> arcSdeConn =
connMgr->CreateConnection(L"OSGeo.ArcSDE");

2 - Try wrapping your pointers to Fdo classes within a FdoPtr smart pointer
template. That will auto-release your pointers when the smart pointer goes
out of scope.

- Jackie


Fuji Deng wrote:
> 
> Hi, 
>         I tried to use ArcSDEProvider92.dll (It’s file version number is
> 3.4.0.0),  I encounted a memory leak problem. 
> The test environment: 
> 1. The application is running in WindowsXP with the latest updates. 
> 2. The application is compiled by Visual Studio 2008 SP1. 
> 3. SQL-Server 2008 And ArcSDE9.2 in Windows 2003 SP2 with almost the
> latest updates. 
> 4. About ArcSDEProvider92.dll, I test both the file downloaded from
> website and compile by source codes. 
> 
> There’s the test sample codes at the end of this post. 
> I set 2 breakpoints in the _tmain function, one is at the “for (int i = 0;
> i < 100; i++)”, the other one is at the “return 0;” The difference of
> memory usage between these 2 breakpoints is about 60 MB, that means
> there’re 60 MB memory not released. 
> In each loop, there’re about 300 shapes be read, those shapes are simple
> polygons, each polygon contains about 5-10 points. 
> I tried to release the all resources in the “for” loop, but it seems
> there’re still some memory not released. 
> 
>         Do I miss something when try to release memory? Or is it the
> ArcSDEprovider92.dll issue? 
> 
> #include "stdafx.h" 
> #include "string.h" 
> #include <Windows.h> 
> #include "Fdo/Connections/IConnection.h" 
> #include "Fdo/Commands/CommandType.h" 
> #include "Fdo/Commands/ICommand.h" 
> #include "Fdo/Commands/IFeatureCommand.h" 
> #include "Fdo/Commands/Feature/ISelect.h" 
> #include "Geometry/Fgf/Factory.h" 
> #include "Common/Array.h" 
> 
> typedef FdoIConnection* (*CreateConnectionProc)(); 
> 
> #ifdef _WIN32 
> 
> #ifndef ARCSDEPROVIDER_EXPORTS 
> #define FDOSDE_API __declspec(dllexport) 
> #else 
> #define FDOSDE_API __declspec(dllimport) 
> #endif 
> #endif 
> 
> class ArcSDELoaderLibrary 
> { 
> private: 
>     HMODULE m_hArcSDE; 
> 
> public: 
>     ArcSDELoaderLibrary() 
>     { 
>         m_hArcSDE = NULL; 
>         try 
>         { 
>             HMODULE hmod = ::LoadLibraryW(L"sde.dll"); 
>             if (hmod != NULL) 
>             { 
>                 ::FreeLibrary(hmod); 
>                 m_hArcSDE = ::LoadLibraryW(L"ArcSDEProvider92.dll"); 
>                 // in case load ArcSDEProvider92.dll fails try to load 91 
>                 if (m_hArcSDE == NULL) 
>                     m_hArcSDE = ::LoadLibraryW(L"ArcSDEProvider91.dll"); 
>             } 
>             else 
>                 m_hArcSDE = ::LoadLibraryW(L"ArcSDEProvider91.dll"); 
>         } 
>         catch(...){} 
>     } 
>     HMODULE GetLibraryHandle() 
>     { 
>         return m_hArcSDE; 
>     } 
>     ~ArcSDELoaderLibrary() 
>     { 
>         try 
>         { 
>             if (m_hArcSDE != NULL) 
>                 ::FreeLibrary(m_hArcSDE); 
>         } 
>         catch(...){} 
>     } 
> }; 
> 
> static ArcSDELoaderLibrary arcSDEloader; 
> // external access to connection for client services 
> extern "C" FDOSDE_API FdoIConnection* CreateConnection () 
> { 
>     CreateConnectionProc procCreateConn; 
>     HMODULE hArc = arcSDEloader.GetLibraryHandle(); 
> 
>     if (hArc != NULL) 
>     { 
>         procCreateConn = (CreateConnectionProc)::GetProcAddress (hArc,
> "CreateConnection"); 
>         if (procCreateConn != NULL) 
>             return procCreateConn(); 
>     } 
>     return NULL; 
> } 
> 
> 
> int _tmain(int argc, _TCHAR* argv[]) 
> { 
>         FdoIConnection* connection = CreateConnection(); 
>         FdoString* connectionString =
> L"Server=serverIP;Instance=5151;Username=username;Password=password;Datastore=datastore"; 
>         FdoFgfGeometryFactory* factory =
> FdoFgfGeometryFactory::GetInstance(); 
>         connection->SetConnectionString(connectionString); 
>         FdoConnectionState state = connection->Open(); 
> 
>         for (int i = 0; i < 100; i++) 
>         { 
>                 FdoISelect* command =
> (FdoISelect*)connection->CreateCommand(FdoCommandType_Select); 
>                 command->SetFeatureClassName(L"TableName"); 
>                 command->SetFilter(L"Shape ENVELOPEINTERSECTS
> GeomFromText(‘Wkt of the specify extent.')"); 
>                 FdoIFeatureReader* reader = command->Execute(); 
>                 
>                 while (reader->ReadNext()) 
>                 { 
>                         FdoByteArray* ba =
> reader->GetGeometry(L"ShapeColumnName"); 
>                         FdoIGeometry* geometry =
> factory->CreateGeometryFromFgf(ba); 
>                         ba->Release(); 
>                         geometry->Release(); 
>                 } 
>                 reader->Release(); 
>                 command->Release(); 
>         } 
> 
>         connection->Release(); 
>         factory->Release(); 
> 
>         return 0; 
> }
> 
> 

-- 
View this message in context: http://n2.nabble.com/Memory-problem-with-ArcSDEProvider92.dll-tp3003984p3004254.html
Sent from the FDO Users mailing list archive at Nabble.com.



More information about the fdo-users mailing list