Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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
我是否可以安全地将GDAL与共享_ptr一起使用,而不是创建/销毁函数? 我使用GDAL.< /P>在C++ 11中创建一个SeabFEFLE文件_C++_C++11_Shared Ptr_Gdal - Fatal编程技术网

我是否可以安全地将GDAL与共享_ptr一起使用,而不是创建/销毁函数? 我使用GDAL.< /P>在C++ 11中创建一个SeabFEFLE文件

我是否可以安全地将GDAL与共享_ptr一起使用,而不是创建/销毁函数? 我使用GDAL.< /P>在C++ 11中创建一个SeabFEFLE文件,c++,c++11,shared-ptr,gdal,C++,C++11,Shared Ptr,Gdal,我是否可以安全地使用共享_pt而不是SomeGDALType::CreateSomeGDALType()和SomeGDALType::destromegdaltype() 我注意到,对于库需要的所有指针,示例代码都遵循此模式: OGRFeature *poFeature poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() ) ... other code that calls library function wi

我是否可以安全地使用共享_pt而不是SomeGDALType::CreateSomeGDALType()和SomeGDALType::destromegdaltype()

我注意到,对于库需要的所有指针,示例代码都遵循此模式:

OGRFeature *poFeature
poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() )

... other code that calls library function with above pointer ...

OGRFeature::DestroyFeature( poFeature );
//end of function.
因为我希望我的指针总是被很好地清理干净,所以我希望使用这样一个共享指针:

std::shared_ptr<OGRFeature>poFeature(OGRFeature::CreateFeature( poLayer->GetLayerDefn()),OGRFeature::DestroyFeature);;

... other code that calls library function with poFeature.get() ...

//end of function
std::shared_ptrpoFeature(OGRFeature::CreateFeature(poLayer->GetLayerDefn()),OGRFeature::DestroyFeature);;
... 使用poFeature.get()调用库函数的其他代码。。。
//功能结束
完整的代码在这里

如果我的代码抛出异常,这就避免了内存泄漏的问题。 我的代码编译、运行并创建一个有效的形状文件

我的问题有两个:

首先; 是否有一个特定的原因,我想让库专门分配和取消分配内存(从而可能在另一堆上分配内存),这就是我调用示例的create和destroy函数时发生的情况


第二;除了我这方面明显的编程错误之外,我提出的替代实现是否会导致问题?

很多时候,当您看到库有
Create()
Destroy()
方法时,这是因为它们想在同一个dll中创建和销毁对象。如果在一个dll中分配对象,然后在另一个dll中销毁它,则必须保证对象的二进制可比性,这就是。@CoryKramer我知道必须使用同一个分配器来创建和删除资源,但无论是创建和删除指针,还是库执行相同的操作,情况都是如此。顺便提一下我刚刚编辑了我的代码来调用create-an-delete函数(我以前没有意识到这是std::shared_ptr的一个选项)。在类似情况下,我遇到的一个问题是库(不是gdal)在“parent”对象销毁时自动释放一些内容,导致双重释放。GDAL是否声明您负责销毁所有这些实例?这是一个好问题@bartoli,我需要调查。看起来我确实需要处理我提到的对象,但是,使用Valgrind,我确定我的程序没有创建memoryleak;但是,它确实创建了其他对象:正如在这个页面中隐藏的C++示例所见的:在底部附近::PODs > > CealelayReor()被调用,它返回指针,并且从不被删除,从我可以知道的,甚至不被PODS类的析构函数所删除。这让我很困惑,我一定是遗漏了什么。很多时候,当你看到库有
Create()
Destroy()
方法时,这是因为它们想在同一个dll中创建和销毁对象。如果在一个dll中分配对象,然后在另一个dll中销毁它,则必须保证对象的二进制可比性,这就是。@CoryKramer我知道必须使用同一个分配器来创建和删除资源,但无论是创建和删除指针,还是库执行相同的操作,情况都是如此。顺便提一下我刚刚编辑了我的代码来调用create-an-delete函数(我以前没有意识到这是std::shared_ptr的一个选项)。在类似情况下,我遇到的一个问题是库(不是gdal)在“parent”对象销毁时自动释放一些内容,导致双重释放。GDAL是否声明您负责销毁所有这些实例?这是一个好问题@bartoli,我需要调查。看起来我确实需要处理我提到的对象,但是,使用Valgrind,我确定我的程序没有创建memoryleak;但是,它确实创建了其他对象:正如在这个页面中隐藏的C++示例所见的:在底部附近::PODs > > CealelayReor()被调用,它返回指针,并且从不被删除,从我可以知道的,甚至不被PODS类的析构函数所删除。这让我很困惑,我肯定错过了什么。