程序中的所有指针变量在突然崩溃后都被删除了吗
Do all the pointer variables inside a program got deleted after sudden crash?
我有一个基于IP的摄像头(basler Ace2000-50gm),连接到运行ubuntu 12.04 64位的嵌入式板上。我设法根据它的文档配置了它,现在我可以用我喜欢的任何参数以任何帧速率获取帧。(我使用了C++API)
这是初始化代码:
typedef Pylon::CBaslerGigEInstantCamera Camera_t;
void Cam_Init()
{
bool Camera_Initialization = false;
Camera_t *Camera;
Camera = new Camera_t();
PylonInitialize();
do{
if(!Camera_Initialization)
{
try
{
CTlFactory& tlFactory = CTlFactory::GetInstance();
// Get all attached devices and exit application if no device is found.
DeviceInfoList_t devices;
qDebug("Detecting Camera ....");
if ( tlFactory.EnumerateDevices(devices) == 0 )
{
throw RUNTIME_EXCEPTION( "No camera present.");
}
Camera = new Camera_t( tlFactory.CreateDevice( devices[0 ]) );
Camera->Open();
CAcquireContinuousConfiguration().OnOpened( *Camera);
Camera->StartGrabbing( GrabStrategy_UpcomingImage);
Camera_Initialization = true;
qDebug("Camera is Configured Successfully");
}
catch( GenericException &e )
{
Interface<< "**** An exception occurred! Desription is: " << "n"<< " " << e.GetDescription() << "n";
}
}
}while(!Camera_Initialization);
}
此代码是大型程序的一部分。
问题是我的程序突然崩溃(我还没有找到它的源代码),当我重新运行代码时,它直到上次崩溃后5分钟或更长时间才检测到相机!!!它给出以下错误信息
**** An exception occurred! Desription is:
Failed to open 'Basler acA2000-50gm#00305316A684#10.136.18.100:3956'. The device is controlled by another application. Err: GX status 0xe1018006 (0xE1018006)
正如你所看到的我初始化相机的代码,我使用了一个指针对象来连接我的相机,我认为当代码崩溃时,这个指针不会被删除,所以相机不可用!
我也认为这是一种网络问题,我不知道如何解决它。当我的程序崩溃时,我尝试了各种不同的方法来重新启动Ubuntu中的网络服务,例如:
sudo service network-manager restart
sudo ifdown eth0 && sudo ifup eth0
.
.
.
但它们都不适用于我,而且当我的程序崩溃时,运行我的程序需要5分钟以上。
令人惊讶的是,5分钟后,我的代码正确地检测到了相机,并且我能够运行我的代码。我尝试了无数次,我必须至少停留5分钟才能运行检测摄像头的代码!!!(在接下来的5分钟内,它重复显示上述错误消息)我在自己的笔记本电脑和PC上多次运行此代码,但在代码崩溃后,我可以毫无问题地运行代码,所以我认为问题出在嵌入式板网络上!
我以为每一种变量都会在终止程序后被删除,但这样想似乎有点错误!
我可以提供你想要解决这个问题的任何信息。感谢
内存被释放,但析构函数将不会运行。可能析构函数通知系统它不再是控制设备。
我认为这是系统中的一个错误。事实上一个特定的过程是控制设备应该表现得很好就像open
一样,如果进程崩溃独立的(在Unix下,这可以通过将其实现为例如某种伪设备。)
C++标准(§18.3/8):"调用exit()不会破坏自动对象。"
"正常终止进程,为终止进程执行定期清理。"
其中,定期清理是对静态对象的销毁,而不是动态分配的对象。
为了解决这个问题,你可以试着摆弄信号处理程序,如果你有指向相机的指针,就在那里断开连接。
当你尝试的时候,我发现了内存泄漏!
Camera = new Camera_t();
和
Camera = new Camera_t( tlFactory.CreateDevice( devices[0 ]) );
中间没有空闲。同样也没有相机的回报,所以我必须假设
CAcquireContinuousConfiguration().OnOpened( *Camera);
不知怎的有Camera
的地址,否则还有另一个泄漏。
信号处理程序
如果您有某种全局访问设备的方法,那么如果main中的try-catch
不能,那么其中一个信号处理程序可能能够捕获您的错误。
此故障与C++或任何其他编程语言无关,也与操作系统无关。事实上,这是Basler Pylon API的意图。原因是,通信是通过UDP完成的。这是一个无连接的网络协议。为了知道对方仍然存在,Basler摄像头协议驱动程序(在您的网络接口中)将循环发送一些数据,也称为心跳消息。默认的心跳超时为3000ms,但在调试过程中会自动增加到5分钟。因此,大约需要5分钟,直到摄像机知道原始连接丢失,并允许进行另一个连接。
(来自Pylon.Net帮助)
使用GigE相机调试挂架应用程序
当使用GigE相机调试挂架应用程序时,您可能会遇到所谓的"心跳"超时。应用程序必须以定义的间隔向摄像机发送特殊的网络数据包。如果相机没有及时接收到这些心跳,它将认为连接已断开,并且不会接受来自应用程序的任何命令。
为了解决这个问题,您必须在开发过程中延长心跳超时时间。可以通过设置PYLON_GIGE_HEARTBEAT环境变量来执行此操作。这将指示挂架在打开相机时将心跳间隔更改为给定值。或者,您可以在代码中设置相机传输层的HeartbeatTimeout属性。
Copycamera.Parameters[PLTransportLayer.HeartbeatTimeout].TrySetValue(1000, IntegerValueCorrection.Nearest); // 1000 ms timeout
当在调试器下运行时,挂架GigE传输层会自动将设备的心跳超时设置为5分钟。这可以通过设置PYLON_GIGE_HEARTBEAT环境变量来覆盖。我们建议不要依赖默认机制,而是通过如上所述设置适当的心跳超时来明确指定心跳超时。
注意
如果您将心跳超时设置为高值,并在未通过调用Close()方法正确关闭设备的情况下停止应用程序,则将无法再次打开相机。此外,您还会收到一个错误,说明设备当前正在使用中。如果使用调试器停止应用程序,则可能会发生这种情况。若要再次打开相机,必须等待超时,或者断开网络电缆与相机的连接
- 在虚幻引擎中删除NXOpen对象时崩溃
- 无法删除EXE崩溃后,即使进程未显示在任务管理器中
- 删除SDL_PollEvent时程序崩溃
- 删除数组 c++ 崩溃问题
- 在C++中删除指针数组时析构函数崩溃
- 使用自定义上下文菜单删除 QTreeView 项崩溃
- 如果我从single_digits[*num - '0']]中删除'0',为什么这个程序会崩溃)
- 删除动态字符串时程序崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 删除关键字导致程序崩溃
- C++将自删除推回矢量时崩溃
- 为什么要删除指针崩溃wchar_t?
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 当我尝试删除指针时,我的程序崩溃
- 当我递增指针然后将其删除时,为什么我的程序会崩溃
- qquickvew删除导致应用程序崩溃
- C++:指向对象的指针数组 - 删除元素时程序崩溃>
- c 从范围删除对象的操作员导致崩溃dealloceLoceLoceLoceLoceLoceLoceLoceLoceL
- libpng 的C++抽象导致 malloc 崩溃 -- 删除 2D 数组"Jagged"
- 崩溃删除[]初始化的字符串