2015-07-29 5 views
0

Я использую 3 участник SDK для получения информации самописца (http://pdn.pelco.com/content/creating-pelco-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:[email protected]://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:[email protected]://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; 
    } 
} 

Это прекрасно работает, но когда я иду, чтобы удалить указатель, то он бросает отладки asertion каждый раз: enter image description here

enter image description here

Я не могу использовать указатель на этот объект ??

+0

* Где * это катастрофа произойдет? Попробуйте запустить программу в отладчике, отладчик остановится в месте сбоя, позволяя вам изучить значения задействованных переменных, а также изучить (и подойти) стек вызовов функций. Поднимите стек вызовов, пока не получите код. Что касается * почему * он падает, может быть много причин, в том числе (но не ограничиваясь этим), вы изменяете указатель, вы пишете за пределами где-то и многое другое. Кроме того, попробуйте создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам. –

+0

@JoachimPileborg он падает точно при удалении указателя, как говорится в моем сообщении. –

+0

В приведенных выше двух примерах верхняя часть работает, но нижняя часть падает, когда я удаляю указатель. –

ответ

1

В соответствии с руководством по программированию Pelco SDK существует метод Remove() для удаления системного объекта. Системный объект указан в кеше как другой объект устройства. После создания системного объекта и его использования. Существуют и другие объекты, которые ссылаются на системный объект. Вы просто не можете просто удалить системный объект. Вы должны вызвать метод Remove() для удаления системного объекта. Также System.Remove() не удаляет объект немедленно. Он удаляется только после того, как все ссылки на этот объект System были выпущены. Я бы предложил использовать ссылку, а не указатель на обертку системного объекта, так что вам не нужно беспокоиться об ее удалении.

Вот пример того, что я имею в виду обернуть его с помощью ссылки:

class MyPelcoWrapper 
{ 
public: 
    /** 
    * Constructor 
    */ 
    MyPelcoWrapper() 
     : mySystem("admin:[email protected]://...") 
    { 
     ... 
    } 

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

private: 
    PelcoSDK::System mySystem; 
}; 

int _tmain(...) 
{ 
    ... 

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

} 
+0

re: Также система.Удалить() не удаляет объект немедленно. - Я пробовал .Remove(), и он все еще разбился, но теперь я понимаю, что он не сразу удаляется. Благодарю. Я не знаю, как я могу использовать ссылку на объект System, но поскольку ссылка должна быть инициализирована (и не может быть переназначена), и я хочу, чтобы класс, который имеет переменную-член PelcoSDK :: System, которую я могу инициализировать в конструкторе , –

+1

@Harry Boy: см. Мой отредактированный ответ о том, как обернуть системный объект и использовать его по ссылке. – simon

+0

Мне нравится ваше решение! Но мне нужно иметь возможность переходить в подробности регистрации на более позднем этапе. Как я могу это сделать? –

 Смежные вопросы

  • Нет связанных вопросов^_^