Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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风格接口来管理cpp中的内存?_C++_C++11 - Fatal编程技术网

C++ 我应该如何通过调用C风格接口来管理cpp中的内存?

C++ 我应该如何通过调用C风格接口来管理cpp中的内存?,c++,c++11,C++,C++11,我想在代码中使用智能指针管理指针,但我必须调用旧的C风格接口来获取指针,如下所示: void getPointer(T** pT, int* pSize); 用户传递一个空指针Pt并返回一个指针,我想在我的代码中使用智能指针来管理它,如 std::shared_ptr<T> ptr; std::shared_ptr ptr; 我应该如何编写代码?我被告知使用get()方法不是一个安全的想法。 另一个问题是,我应该如何安全地将存储在智能指针中的内存复制到原始指针?(或反之)您可以

我想在代码中使用智能指针管理指针,但我必须调用旧的C风格接口来获取指针,如下所示:

void getPointer(T** pT, int* pSize);
用户传递一个空指针Pt并返回一个指针,我想在我的代码中使用智能指针来管理它,如

std::shared_ptr<T> ptr;
std::shared_ptr ptr;
我应该如何编写代码?我被告知使用get()方法不是一个安全的想法。
另一个问题是,我应该如何安全地将存储在智能指针中的内存复制到原始指针?(或反之)

您可以从
T*
构建
std::shared\u ptr
(或
std::shared\u ptr
)。如果未为
T
(s)分配
new
[]
),则需要为共享指针提供正确的解除分配

假设存在一个
void返回指针(T*pT,int size)在该C接口中

struct C_interface_deleter {
    void operator()(T* ptr) { returnPointer(ptr, size); }
    int size;
};

void use_C_interface() {
    T* raw;
    int size;
    getPointer(&raw, &size);
    std::shared_ptr<T> ptr(raw, C_interface_deleter{ size });

    // stuff involving ptr
}
struct C_interface_deleter{
void运算符()(T*ptr){returnPointer(ptr,size);}
整数大小;
};
无效使用C_接口(){
T*生的;
整数大小;
getPointer(&raw,&size);
std::shared_ptr ptr(原始、C_接口_deleter{size});
//涉及ptr的东西
}

一切都取决于谁拥有什么。(智能“指针”更多地是关于所有权规则的形式化,而不是关于内存管理。)
getPointer
如何处理指针?
get()
将不起作用。您应该首先从C API获取指针,然后从该API创建智能指针。但是,如果这真的是C,请检查内存是否分配了
new[]
,因为如果它使用
malloc
,您将需要自定义删除程序。我们将
pT
作为
nullptr
传递,并且在C接口中,它将
new
一个T类型指针。以前,在我们的代码中,我们自己删除指针。这是非常旧的代码风格,很难管理指针。