首页 / 浏览问题 / 组件GIS / 问题详情
UGWorkspace需要delete吗
30EXP 2018年05月23日
c++ iobjects

问题:
UGWorkspaceConnection* pworkSpaceCnn = new UGWorkspaceConnection();

...
UGWorkspace* pWorkSpace = new UGWorkspace();
UGbool bSucc = pWorkSpace->Open(*pworkSpaceCnn);
1、需要delete pWorkSpace 吗?pWorkSpace 应该如何释放?那么pworkSpaceCnn 呢?如何释放?

2、 pWorkSpace->Open失败的可能原因有哪些?

open失败时,我这里提示如下

Unhandled exception at at 0x764CC54F in mytool.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x5599DE54.

非常感谢!
问题关闭原因: 发现不是这里的原因,但是内存还是不停的增长

1个回答

是程序打开第一个工作空间都打不开还是打开了以后后再去打开另一个工作空间打不开?
4,620EXP 2018年05月24日
打开第一个工作空间的时候是不需要delete的,这种情况下通常是由于pworkSpaceCnn参数设置有问题,最好是把全部参数代码贴出来

上面是崩溃时,发现会申请一个很大的内存,下面代码是崩溃的地方

贴代码:

void CPiArcgisClass::getudbPath(CString ssmwuFileFullPath, vector<CString>& vecudbPath)
{
    UGWorkspace* pWorkSpace = new UGWorkspace();
    UGWorkspaceConnection* pworkSpaceCnn = new UGWorkspaceConnection();

    pworkSpaceCnn->m_strServer = ssmwuFileFullPath;
    pworkSpaceCnn->m_nWorkspaceType = 9;
    UGbool bSucc = pWorkSpace->Open(*pworkSpaceCnn);//崩溃后,停在这个地方,提示这里是将要执行的下一条语句
    if (!bSucc)
    {
        AfxMessageBox(_T("打开工作空间失败!"));
        return;
    }

    UGint nDataSources = pWorkSpace->m_DataSources.GetCount();
    for (UGint i = 0; i < nDataSources; i++)
    {
        UGString strname;
        UGDataSource* pds;
        pWorkSpace->m_DataSources.GetAt(i, strname, pds);

        UGbool bhasDatasourceOpened = pds->IsOpen();
        if (!bhasDatasourceOpened)
        {
            bhasDatasourceOpened = pds->Open();
        }

        UGString ugDatasourcePath = pds->GetName();
        vecudbPath.push_back(getDatasourcePath(ugDatasourcePath));
        pds->Close();
    }
    pWorkSpace->Save();
    pWorkSpace->Close();
    pWorkSpace = NULL;
}

我看了内存,大概1G的数据,全部打开后,再关闭,发现内存上涨了1G,多次打开关闭这1G数据后,资源监视器中可用内存为0,程序崩溃,备用内存还有1.7G,但是我也做了数据集、数据源和工作空间的关闭,关闭难道不会释放空间吗?
关闭不会自动释放内存,需要自己去释放
就是这个工作空间、工作空间连接、数据源等这些该怎么释放,是不是就delete就OK了呢?
恩,c++对象释放内存通用的
...