Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gp\u摄像机\u文件\u如何工作?_C++_C_Memory_Libgphoto2 - Fatal编程技术网

C++ gp\u摄像机\u文件\u如何工作?

C++ gp\u摄像机\u文件\u如何工作?,c++,c,memory,libgphoto2,C++,C,Memory,Libgphoto2,我是libgphoto2新手,对实际图像内存的位置有一些疑问。照片似乎是通过一个名为CameraFile的对象访问的。源代码中有一个名为sample capture.c的示例,它有一个名为capture\u to\u memory的函数 在该函数中,使用gp\u file\u new创建并初始化CameraFile对象。gp\u file\u new的实现创建了一个CameraFile对象,其accesstype成员设置为gp\u file\u accesstype\u MEMORY 然后,该C

我是libgphoto2新手,对实际图像内存的位置有一些疑问。照片似乎是通过一个名为
CameraFile
的对象访问的。源代码中有一个名为sample capture.c的示例,它有一个名为
capture\u to\u memory
的函数

在该函数中,使用
gp\u file\u new
创建并初始化CameraFile对象。
gp\u file\u new
的实现创建了一个
CameraFile
对象,其accesstype成员设置为
gp\u file\u accesstype\u MEMORY

然后,该
CameraFile
对象被传递到
gp\u camera\u file\u get
,我不太清楚这个函数中发生了什么

调用
gp\u-camera\u-file\u-get
后,文件将被发送到
gp\u-file\u-get\u-data\u和\u-size
。查看该函数的实现,如果files accesstype是
GP\u FILE\u accesstype\u MEMORY
,那么
GP\u FILE\u get\u data\u和\u size
函数将不会分配任何内存,而只是将指针分配给CameraFile的数据成员(与size相同)

那么这个指针指向的内存在哪里呢?它在真实的摄像机上吗?还是在我的公羊里?我只是尽量避免内存操作。我发现了一篇很好的博客文章

其中,
CameraFile
对象是通过
gp\u file\u new\u从\u fd
创建的。这将文件访问类型设置为
GP\u FILE\u accesstype\u FD
。当对具有此访问类型的文件调用
gp\u file\u get\u data\u和\u size
时,将分配新内存并将文件的数据复制到其中。然而,这是从磁盘读取的,或者至少我认为是因为FD表示Unix文件描述符,并且它需要实际的文件名字符串。这是否意味着如果摄像头文件的accestype为
gp\u文件访问类型\u FD
,则
gp\u摄像头\u文件\u get
会将数据读取到磁盘上的文件中

有一个函数叫做
gp\u file\u free
。如果它是一个FD文件,它会关闭文件句柄,但它不会在任何地方调用
free(file->data)
,所以我很困惑

gp\u摄像头\u文件\u get
做什么?实现就在那里,但它让我有点不知所措。它是否真的将文件从我相机的内存带到我电脑的内存,并在ram中分配
CameraFile->data
?或者它只是给了我一个存储在我相机上的东西的手柄


抱歉,如果问错地方了,我确实看到了libgphoto2的邮件列表,但我不知道它有多活跃

没关系,我想我找到了

因此,
gp\u-camera\u-file\u-get
最终调用了
gp\u-filesystem\u-get\u-file
,它调用了
gp\u-filesystem\u-get\u-file\u-impl
。该函数查看
CameraFileType
,如果它是
GP\u FILE\u TYPE\u NORMAL
(在我的例子中就是这样),它将调用
GP\u FILE\u copy
,并将CameraFileSystemFile的实例作为源

gp\u file\u copy
如果
gp\u file\u ACCESSTYPE\u MEMORY
是目标文件的访问类型,则调用
malloc
,如果访问类型是
gp\u file\u ACCESSTYPE\u FD
,则写入磁盘

然后,调用
gp\u file\u free
调用
gp\u file\u clean
,如果accesstype是
gp\u file\u accesstype\u MEMORY
,则调用
free