首页 文章

如何在应用程序开始时分配所有内存,然后在整个过程中对其进行相应的类型化

提问于
浏览
1

我需要预先分配我的应用程序将使用的所有内存 . 然后每当需要使用我需要进行计算的数据覆盖该内存时 . 在进行任何计算之前必须首先分配内存,因为我正在尝试并行运行多线程CUDA算法,如我在此处的问题(Multi-Threaded CPU CUDA application not asynchronous when calling CudaFree)中所述 .

我以为我可以将所需的所有内存分配为字节指针,然后将该指针存储为void指针:

void * allocateMemory()
{
    byte *mem;
    int nbytes = 13107200;
    mem = (byte *) malloc(nbytes);
    return mem;
}

稍后在我的程序中,我想使用已经分配用于存储数据的内存 . 我提前不知道数据的类型,但我知道它的大小不会超过分配的限制 .

void doSomething(void * mem)
{
    int *a = (int*) mem;
    for (int i = 0; i < 100; i++)
    {
        a[i] = i;
    }

    //do stuff

}

还有许多其他函数,比如上面的doSomething(void * mem),但是使用double或float类型,甚至可以键入byte . 我需要能够用我需要的任何数据类型覆盖orignally分配的内存 . 上面的代码不起作用,因为它说我无法遵循void指针 . 它还说我试图读取或写入受保护的内存 .

这样做的正确方法是什么?实现我的目标的最佳方法是在开始时分配所有内存,然后在整个过程中使用必要的内容?谢谢!

1 回答

  • 1

    听起来你有两个问题 .

    • 无法取消引用void指针 . 在代码中的某处,您使用了 allocateMemory() 的结果而没有强制转换 . 您提供的代码是正常的,但是编译器标记为错误的任何行都不正常 . 例如,也许你有:
    void *foo = allocateMemory();
    foo[42];  // compiler doesn't have a real type here - error
    ((int*)foo)[42];  // compiler happy
    
    • 尝试访问受保护的内存 . 在代码中的某处,您有一个无效的指针 . 最可能的原因是 allocateMemory() 返回NULL(您没有检查) .

    你的一般方法对我来说似乎没问题;您描述的问题与代码中的详细信息有关,而不是整体概念 .

相关问题