我正在使用第三方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;
}
}
我无法使用指向此对象的指针吗?
答案 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();
...
}