【问题标题】:arrayfire, pointers, and c++arrayfire、指针和 C++
【发布时间】: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++ 中使用mallocmalloc 不调用构造函数,之后您必须使用放置 newWhat 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


【解决方案1】:

看来我终于找到了解决方案。似乎使用这个:std::vector&lt;af::array&gt; Kernels; 让我获得了我想要的所有功能。事实证明,双指针可以编译,但 arrayfire 中的函数不是为处理 af::array* 对象指针而构建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2023-03-11
    • 2017-05-13
    相关资源
    最近更新 更多