相关疑难解决方法(0)

"放置新"有什么用途?

有没有人曾经使用过C++的"贴牌新品"?如果是这样,那该怎么办?在我看来,它只对内存映射硬件有用.

c++ memory-management placement-new new-operator

385
推荐指数
18
解决办法
16万
查看次数

重新分配用new分配的内存是否安全?

从什么是写在这里,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如果可能的话可以使用相同的区域.

c++ memory-management realloc

32
推荐指数
5
解决办法
7514
查看次数

在 Cython 中使用智能指针来动态分配数组

我正在为带有签名的函数调用编写 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 …

memory arrays smart-pointers cython

5
推荐指数
1
解决办法
1422
查看次数

使用unique_ptr和cudaMalloc

我一直在考虑在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)

pointers cuda unique-ptr c++11

4
推荐指数
1
解决办法
1455
查看次数

如何从原始 C 堆内存指针初始化 unique_ptr?

我正在使用一个函数(它是库的一部分),它返回一个uint8_t*指向已在堆上分配并保存图像像素数据的内存的原始指针。这个函数的调用者负责调用free指针。

我调用此函数的代码有许多提前终止的分支,因此我需要free(buffer)在许多点调用。我认为最好将缓冲区包装在 a 中,unique_ptr以便当它超出范围时,内存会自动释放。

我怎样才能做到这一点?

作为参考,函数 decleration 看起来像这样:(uint8_t* getFrame()我已经知道图像的宽度、高度和 num 通道以及缓冲区的长度);

c++ smart-pointers heap-memory unique-ptr raw-pointer

2
推荐指数
1
解决办法
273
查看次数