Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.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++ C++;非对象类型的智能指针?_C++_Smart Pointers_Shared Ptr_Auto Ptr - Fatal编程技术网

C++ C++;非对象类型的智能指针?

C++ C++;非对象类型的智能指针?,c++,smart-pointers,shared-ptr,auto-ptr,C++,Smart Pointers,Shared Ptr,Auto Ptr,我正在尝试使用智能指针,如自动、共享指针。然而,我不知道如何在这种情况下使用它 CvMemStorage *storage = cvCreateMemStorage(); ... use the pointer ... cvReleaseMemStorage(&storage); 我不确定,但我认为存储变量只是一个MalClice内存,而不是C++类对象。有没有办法为存储变量使用智能指针 谢谢。共享\u ptr允许您指定自定义deallocator。但是,查看文档cvreleasems

我正在尝试使用智能指针,如自动、共享指针。然而,我不知道如何在这种情况下使用它

CvMemStorage *storage = cvCreateMemStorage();
... use the pointer ...
cvReleaseMemStorage(&storage);

我不确定,但我认为存储变量只是一个MalClice内存,而不是C++类对象。有没有办法为存储变量使用智能指针


谢谢。

共享\u ptr允许您指定自定义deallocator。但是,查看文档
cvreleasemstorage()
没有正确的格式(
void f(t*)
),您需要一个包装器:

void myCvReleaseMemStorage(CvMemStorage* p) {
   cvReleaseMemStorage(&p);
}

shared_ptr<CvMemStorage> sp(cvCreateMemStorage(), &myCvReleaseMemStorage);
void mycvreleasemstorage(CvMemStorage*p){
cvreleasemstorage&p;
}
共享_ptr sp(cvCreateMemStorage(),&mycvreleasemstorage);

共享的
类允许您提供自定义的删除函数/functor,您可以简单地将
cvreleasemstorage
函数包装在一个函数中,并为
shared\u ptr
提供该函数以及您希望它为您管理的指针?

如果不查看
cvCreateMemStorage
的源代码,我们无法告诉您如何分配内存。它可能是
malloc
ed,可能是
new
ed,可能不是任何东西,可能函数
cvCreateMemStorage
总是返回
NULL
。您确定
cvreleasemstorage
使用
CvMemStorage**
而不是
CvMemStorage*
?这似乎很奇怪。确实很奇怪,但是。@ereOn:是的,它是一个CvMemStorage**,我认为它可能会在发布资源后将指针设置为NULL。还要注意的是,
shared\u ptr
的这一特性经常被低估。要使
auto_ptr
工作,用户需要知道如何释放它,但是使用
auto_ptr
可以指定如何在施工时释放,然后将其隐藏起来,用户无需担心。当然,默认的是一个经典的
delete
调用。