C ++中struct的内存分配

时间:2013-08-10 19:49:03

标签: struct

我的结构如下:

typedef struct KeypointSt {
    float row, col;             
    float scale, ori;           
    unsigned char *descrip;     /* Vector of descriptor values */
    struct KeypointSt *next;    
} *Keypoint;

以下是C代码的一部分。考虑到堆的分配和解除分配,我如何将其转换为C ++。

Keypoint k, keys = NULL;
for (i = 0; i < num; i++) {
    /* Allocate memory for the keypoint. */
    k = (Keypoint) malloc(sizeof(struct KeypointSt));
    k->next = keys;
    keys = k;
    k->descrip = malloc(len);

    for (j = 0; j < len; j++) {
        k->descrip[j] = (unsigned char) val;
    }
}

1 个答案:

答案 0 :(得分:0)

转换为C ++的一种可能方法是:

#include <cstring>  // memset()

typedef struct KeypointSt
{
    float row, col;             
    float scale, ori;
    size_t len;         
    unsigned char *descrip;     /* Vector of descriptor values */
    KeypointSt *next;
    KeypointSt(int p_len, int p_val) : row(0.0), col(0.0), scale(0.0),
                                       ori(0.0), len(p_len),
                                       descrip(new unsigned char[len]), next(0)
    { memset(descrip, len, p_val); }
    ~KeypointSt() { delete descrip; }
} *Keypoint;

extern KeypointSt *init_keypoints(size_t num, size_t len, unsigned char val);
extern void        free_keypoints(KeypointSt *list);

KeypointSt *init_keypoints(size_t num, size_t len, unsigned char val)
{
    KeypointSt *keys = NULL;
    for (size_t i = 0; i < num; i++)
    {
        /* Allocate memory for the keypoint. */
        KeypointSt *k = new KeypointSt(len, val);
        k->next = keys;
        keys = k;
    }
    return keys;
}

void free_keypoints(KeypointSt *list)
{
    while (list != 0)
    {
        KeypointSt *next = list->next;
        delete list;
        list = next;
    }
}

int main(void)
{
    KeypointSt *keys = init_keypoints(4, 5, 6);
    free_keypoints(keys);
    return 0;
}

我保持typedef到位的唯一原因是因为你有现有代码;使用KeypointSt *无处不在的C ++代码更好 - 或者将结构标记重命名为Keypoint并使用Keypoint *代替原始Keypoint。我不喜欢typedef隐藏指针的非透明类型。如果我看到声明XYZ xyz;,并且它是结构或类类型,我希望使用xyz.pqr而不是xyz->pqr

我们可以讨论构造函数代码的代码布局,缺少默认构造函数(没有数组),以及缺少复制构造函数和赋值运算符(由于descrip的分配而需要)。 init_keypoints()的代码不是例外安全的;内存分配失败会泄漏内存。修复这是一个练习(我认为这不是很难,但我没有声称异常处理专业知识)。我没有尝试考虑C ++ 11强加的任何额外要求。简单地从C语言翻译成C ++是“容易的”,直到你看到C ++提出的额外要求 - 从长远来看,这些要求会让你的生活更轻松,但需要付出短暂的代价。