【问题标题】:Can I Allocate a Block of Memory with new?我可以用 new 分配一块内存吗?
【发布时间】:2013-11-16 14:15:45
【问题描述】:

所以给定这个 结构:

typedef struct {
    int* arr1;
    int* arr2;
} myStruct;

This answer 描述了使用单个malloc 来同时分配myStruct 及其数组:

myStruct* p = malloc(sizeof(*p) + 10 * sizeof(*p->arr1) + 10 * num * sizeof(*p->arr2);

if(p != NULL) {
    p->arr1 = (int*)(p + 1);
    p->arr2 = p->arr1 + 10;
}

我想知道new 有类似的方法吗?
显然,我希望能够分配给我在运行时收到的大小,就像在 C 示例中所做的那样。

【问题讨论】:

    标签: c c++ c malloc new-operator dynamic-memory-allocation


    【解决方案1】:

    您是否有任何理由想要像您提供的链接中那样做?多一点上下文会有所帮助。否则我个人只会使用构造函数来做到这一点:

        struct myStruct {
            int* arr1;
            int* arr2;
            myStruct(int num)
            {
                    arr1 = new int[10];
                    arr2 = new int[10*num];
            }
            ~myStruct()
            {
                    delete[] arr1;
                    delete[] arr2;
            }
    };
    
    int main()
    {
            int num = 3;
            myStruct* a;
            a = new myStruct(3);
            delete a;
    }
    

    【讨论】:

    • 鉴于他打开了一个如何在 C 中完成的示例,他可能关心 C 模块和 C++ 模块之间的交互,并希望保持 C++ 代码与 C 相似尽可能编码。
    【解决方案2】:

    您可以使用newchar 数组分配一块内存,然后使用placement new 调用该内存块上的构造函数。

    【讨论】:

    • 也可以直接调用分配函数::operator new(size_t)。请务必将new char[N]delete [] ptr::operator new(N)::operator delete(ptr) 匹配
    【解决方案3】:

    在 c++ 中,我们使用new,因为它调用正在分配的对象的构造函数。因此,实现您想要的正确方法是让结构的构造函数进行必要的分配。

    【讨论】:

    • @Mgetz 我并不是说 OP 应该一个一个地调用新的。我是说应该调用 new 来分配数组,但是对象的构造函数应该注意分配他们需要的内存。如果对象自己分配大量内存,那么我们使用内存池
    猜你喜欢
    • 2013-05-09
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多