[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