有没有人曾经使用过C++的"贴牌新品"?如果是这样,那该怎么办?在我看来,它只对内存映射硬件有用.
从什么是写在这里,new分配在自由存储,同时malloc采用堆和这两个术语往往意味着同样的事情.
根据此处的内容,realloc可以将内存块移动到新位置.如果免费存储和堆是两个不同的内存空间,它是否意味着任何问题呢?
具体来说,我想知道它是否安全使用
int* data = new int[3];
// ...
int* mydata = (int*)realloc(data,6*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果没有,是否还有其他方式可以安全地realloc分配内存new?我可以分配新的区域和memcpy内容,但据我所知,realloc如果可能的话可以使用相同的区域.
我正在为带有签名的函数调用编写 Python 包装器
double** foo(double** arrayIn, int dim1, int dim2);
并且需要arrayIn在我的 Python 包装器中构建。这里给出了一种可能的解决方案。但是,由于 Cython 包括对智能指针的支持,我更愿意实施该解决方案。一种方法是将malloc 和 unique_ptr 与自定义删除器结合使用。另一个(更简单的)解决方案是使用libcpp 中的分配器类。
import numpy as np
cimport numpy as np
from libcpp.memory cimport unique_ptr, allocator
def testArray(int dim1, int dim2):
cdef allocator[double *] ptr_al
cdef unique_ptr[double *] myptr
cdef np.ndarray arr
cdef double[:,:] carr
myptr.reset(ptr_al.allocate(dim1))
arr = np.ndarray((dim1,dim2),dtype=np.float64,order='C')
carr = arr
myptr.get()[0] = &carr[0,0]
myptr.get()[1] = &carr[1,0]
myptr.get()[2] = &carr[2,0]
Run Code Online (Sandbox Code Playgroud)
此代码编译并正确执行(使用 Cython …
我一直在考虑在CUDA中将std :: unique_ptr与设备指针一起使用。我想知道的是,当前的c ++ 11 unique_ptr是否可以与cudaMalloc结合使用。我知道它可以与普通的malloc 一起使用(是否可以将C ++智能指针与C的malloc一起使用?),但是cudaMalloc不会在函数的return语句中返回该指针。而是,它返回一个错误代码。指针在引用中返回。
这篇博客文章推荐以下技术:
auto deleter=[&](float* ptr){ cudaFree(ptr); };
std::unique_ptr<float[], decltype(deleter)> d_in(new float[size], deleter);
cudaMalloc((void **) &d_in, size * sizeof(float));
Run Code Online (Sandbox Code Playgroud)
问题:但是,我担心这会创建永不删除(即d_in(new float[size], deleter);)的主机内存吗?除非new float[size]实际上不会生成主机内存或被覆盖?如果上述方法实际上不起作用,可以定义我自己的cudaMalloc包装器吗?-将指针传递给unique_ptr?
就像是:
void* myCudaMalloc(size_t mySize){
void * p;
checkCUDAerrorMacro(cudaMalloc((void**) &p, size);)
return p;
}
...
auto deleter=[](float* ptr){ cudaFree(ptr); };
std::unique_ptr<float[], decltype(deleter)> d_in(myCudaMalloc(size_t mySize), deleter);
Run Code Online (Sandbox Code Playgroud) 我正在使用一个函数(它是库的一部分),它返回一个uint8_t*指向已在堆上分配并保存图像像素数据的内存的原始指针。这个函数的调用者负责调用free指针。
我调用此函数的代码有许多提前终止的分支,因此我需要free(buffer)在许多点调用。我认为最好将缓冲区包装在 a 中,unique_ptr以便当它超出范围时,内存会自动释放。
我怎样才能做到这一点?
作为参考,函数 decleration 看起来像这样:(uint8_t* getFrame()我已经知道图像的宽度、高度和 num 通道以及缓冲区的长度);
c++ ×3
unique-ptr ×2
arrays ×1
c++11 ×1
cuda ×1
cython ×1
heap-memory ×1
memory ×1
new-operator ×1
pointers ×1
raw-pointer ×1
realloc ×1