删除指向对象的指针会导致Break

时间:2015-07-29 11:00:43

标签: c++ pointers sdk assertion

我正在使用第三方SDK获取记录器信息(http://pdn.pelco.com/content/creating-pelco-system

这是一个创建System对象并使用它来获取摄像机信息的小例子。

#include "stdafx.h"
#include "windowsx.h"
#include "objbase.h"

#include "PelcoSDK/PelcoSDK.h"
#include "PelcoSDK/SystemCollection.h"

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);

    if (SUCCEEDED(hr))
    {
        PelcoSDK::Startup();

        PelcoSDK::System system("admin:admin@pelcosystem://192.168.10.123:60001?alias=MyPelco");

        PelcoSDK::DeviceCollection deviceCollection = pSystem.GetDeviceCollection();
        for (deviceCollection.Reset(); deviceCollection.MoveNext();)
        {
            PelcoSDK::Device device(deviceCollection.Current());
            printf("\tDevice Name: %s\n", device.GetModelName());
        }

        return 0;
    }
}

以上工作正常但我现在希望围绕此行为创建一个包装类,所以我想要一个指向PelcoSDK :: System成员变量的指针,如下所示:

#include "stdafx.h"
#include "windowsx.h"
#include "objbase.h"

#include "PelcoSDK/PelcoSDK.h"
#include "PelcoSDK/SystemCollection.h"

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);

    if (SUCCEEDED(hr))
    {
        PelcoSDK::Startup();

        PelcoSDK::System* pSystem = new PelcoSDK::System("admin:admin@pelcosystem://192.168.10.123:60001?alias=MyPelco");

        PelcoSDK::DeviceCollection deviceCollection = pSystem->GetDeviceCollection();
        for (deviceCollection.Reset(); deviceCollection.MoveNext();)
        {
            PelcoSDK::Device device(deviceCollection.Current());
            printf("\tDevice Name: %s\n", device.GetModelName());
        }

        delete pSystem;  <-- Crashes here
        pSystem = nullptr;

        return 0;
    }
}

这很好但是当我去删除指针时,它每次都会抛出一个调试声明: enter image description here

enter image description here

我无法使用指向此对象的指针吗?

1 个答案:

答案 0 :(得分:1)

根据Pelco SDK编程指南,有一种用于删除系统对象的Remove()方法。系统对象在缓存中列为其他设备对象。创建系统对象并使用它之后。还有其他对象引用了系统对象。您根本无法删除系统对象。您必须调用Remove()方法来删除系统对象。此外System.Remove()不会立即删除该对象。只有在释放了对该System对象的所有引用后才会删除它。 我建议使用引用而不是指针来包装你的系统对象,这样你就不必担心删除它了。

以下是我的意思是使用引用包装它的示例:

class MyPelcoWrapper
{
public:
    /**
     * Constructor
     */
    MyPelcoWrapper()
        : mySystem("admin:admin@pelcosystem://...")
    {
        ...
    }

    PelcoSDK::System& GetSystem()
    {
        return mySystem;
    }

private:
    PelcoSDK::System mySystem;
};

int _tmain(...)
{
    ...

    PelcoSDK::Startup();
    ...
    MyPelcoWrapper wrapper;
    ...
    PelcoSDK::System& sys = wrapper.GetSystem();
    sys.GetDeviceCollection();
    ...

}