从calloc()迁移到new

时间:2018-06-14 15:25:23

标签: c++ c++98 construction

我遇到了一个大型pod结构,我想在其中添加std::vector成员。

struct LargePodStruct {
    float x,y,z;
    int *arr;
    int sz;
    ...            // dozens of primitive types
    std::vector<int> the_new_vector;
};

为了向此结构添加vector,我需要用calloc()替换此结构的所有new实例。

另外,我需要将每个现有成员实例化为零。 但是,添加一个将每个成员实例化为零的默认构造函数是一项平凡的任务。在将来忘记实例化新成员也很容易。

LargePodStruct::LargePodStruct()
    x(), y(), z(), arr(), sz(), ... // +dozens of instantiations
{}
  1. 是否有更简单的方法以较少的工作量实例化此结构的原始成员?

  2. 有没有好的&amp;优雅的方式来实例化一个工会成员?

  3. struct LargePodStruct {
        float x,y,z;
        int *arr;
        int sz;
        ...            
        union { 
            int i;
            void *ptr;
         } u;
        std::vector<int> the_new_vector;
    };
    

2 个答案:

答案 0 :(得分:3)

可以继续使用calloc()分配原始内存块,然后使用placement-new在该内存块中构造结构:

void *buffer = calloc(1, sizeof(LargePodStruct));
LargePodStruct *s = new(buffer) LargePodStruct;

但是,您将无法使用delete释放结构,您必须直接调用其析构函数,然后free()内存块:

s->~LargePodStruct();
free(buffer);

答案 1 :(得分:1)

template<typename V>
struct zdf{
    V value;
    zdf():value{}{};
    operator V&(){return value;};
    operator V()const{return value;};
    V operator()const{return value;};
    V& operator(){return value};
};

struct LargeModernValue{
    zdf<float> x,y,z;
    std::vector<int> arr;
    std::any u;/*std::variant<int,void*> u;*/
    //....
    std::vector<int> theNewVec;
};