Malloc C和C ++代码兼容性

时间:2016-02-23 22:23:44

标签: c++ g++

我在C中创建了一个包含以下函数的程序:

void *e_malloc(size_t size)
{
    void *m = malloc(size);

    if (!m)
    {
        printf("Out of memory, fatal error.");
        abort();
    }

    return m;
}

我使用此作为error free malloc,在内存不足时退出程序。问题是,当我使用g++在linux中编译代码时,我得到一个错误,因为它说它需要被转换,并且你可以看到我总是返回一个void指针导致这个问题。什么malloc返回(gcc当然编译好了)。有没有办法我可以修改这个函数,使它适用于两个编译器?我每次只需要施放它吗?还有其他选择可以做我想做的事吗?

此外,当我使用Cmake(通过Clion IDE)时,代码与"-std=C++11"编译得很好。那是为什么?

1

3 个答案:

答案 0 :(得分:3)

您可以更轻松地使用宏:

#define e_new(type) ((type*)malloc(sizeof(type)))
#define e_new_array(type, count) ((type*)malloc((count)*sizeof(type)))

示例用法:

graph_t *g = e_new(graph_t);
graph_t *ten_gs = e_new_array(graph_t, 10);

请注意,这是 特定于您的e_malloc - malloc本身在C ++中存在同样的问题。

答案 1 :(得分:2)

由于编译器错误明确指出,错误在您的调用代码中,而不在您的e_malloc中。

你可能有这样的事情:

graph_t *g;
g = e_malloc(sizeof(graph_t));

错误是void *返回的e_malloc与预期的graph_t*之间的类型转换。常规malloc显示相同的行为。您需要明确地进行类型转换:

g = (graph_t*)e_malloc(sizeof(graph_t));

答案 2 :(得分:0)

你根本不应该在C ++中使用这个结构。在C ++中,您需要使用new,而不是malloc - 并且new已经抛出异常(默认情况下)。问题解决了。