【发布时间】:2020-01-05 18:32:20
【问题描述】:
我一直在尝试以程序方式生成一个 arrayfire 数组。 在过去处理其他对象时,我可以这样:
className * listName = (className*)malloc(numOfObjects*sizeOf(className))
或
className ** listName = (className**)malloc(numOfObjects*sizeOf(className*))
然后使用 for 循环分配列表中的每个内容,并在我完成后将其删除。
但是,这不适用于 arrayfire。 我已经试过了
af::array *Kernels;
Kernels = (af::array*)malloc(Count*sizeof(af::array));
for(int i = 0; i < Count; i++) {
Kernels[i] = af::range(i);
}
稍后我打电话:
free Kernels
此代码可以编译,但在我运行时会崩溃。 这是我在崩溃时得到的:
在抛出 'af::exception' 的实例后调用终止 what():ArrayFire 异常(函数不支持此数据类型:204): 在函数 af_err af_release_array(af_array) 在文件 src/api/c/array.cpp:194 参数 0 的类型无效
在函数 af::array& af::array::operator=(const af::array&) 在文件 src/api/cpp/array.cpp:771 中止(核心转储)
我正在寻找正确的语法来做我想做的事情或替代方法。 我用谷歌搜索了很多,但没有找到我要找的东西。
谢谢。
【问题讨论】:
-
这能回答你的问题吗? Behaviour of malloc with delete in C++
-
TL;DR - 您正在调用未定义的行为。您只能使用
new分配的delete指针。不要在 C++ 中使用malloc(并且在现代 C++ 中根本不要使用手动内存分配) -
不,将代码更改为使用 free 而不是 delete 并不能解决问题。
-
不要在 C++ 中使用
malloc。malloc不调用构造函数,之后您必须使用放置new。 What is the difference between new/delete and malloc/free?. -
@DanielDrake "在 arrayfire 中你不使用像
array* obj = new range(10);这样的东西,它会抛出一个错误。" 这样的语句不会分配一个数组。它分配一个range对象,将10传递给它的构造函数。如果它没有构造函数,则接受单个int(或类型,int可以转换为) - 这将导致编译错误。你不是要写array* obj = new range[10];吗?
标签: c++ memory-management arrayfire