【发布时间】:2020-08-04 20:09:07
【问题描述】:
我想使用 C++ shared_ptr 作为原始 C 指针的替代品。作为一个简单的示例,以下代码似乎可以按预期工作:
from libcpp.memory cimport shared_ptr, allocator
cdef shared_ptr[double] spd
cdef allocator[double] allo
spd.reset(allo.allocate(13))
这里选择大小为13,但一般在编译时是不知道的。 我不确定这是否正确,但我没有任何错误(还没有内存泄漏和段错误)。我很好奇 make_shared 是否有更优化的解决方案。
但我不能使用 C++11 数组,因为 Cython 不允许文字作为模板,例如像
cdef shared_ptr[array[double]] spd = make_shared[array[double,13]]()
应该与 C++20 编译器(例如 gcc 10)一起使用的“普通”数组以某种方式导致问题:
# Cython error "Expected an identifier or literal"
cdef shared_ptr[double[]] spd = make_shared[double[]](3)
# Can't get ptr to work
ctypedef double[] darr
cdef shared_ptr[darr] spd = make_shared[darr](13)
cdef double* ptr = spd.get() # or spd.get()[0] or <double*> spd.get()[0] or ...
分配器解决方案是正确和最好的解决方案,还是有另一种方法?
【问题讨论】:
-
您的解决方案“有效”(可能是 UB)用于双精度,但会泄漏内存用于更复杂的类,因为 shared_ptr 只会破坏第一个对象,而不破坏其他 12 个对象。为什么不使用 std: :vector
而不是整个 shared_ptr-business? -
Btw 数组没有包含在 cython 中,所以也许你做错了?请提供minimal reproducible example。
-
据我所知,如果在编译时不知道大小,则无法使用 std::array 类。即使这是一个相当老套的解决方案 (stackoverflow.com/questions/36357024/…)。
-
我有一些用例,我希望在函数返回“指针”时避免复制数据(因此没有向量),但仍然需要某种引用计数(使用 C 指针我'我手动完成,shared_ptr 会简化)。
标签: cython shared-ptr make-shared