我在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"
编译得很好。那是为什么?
答案 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
已经抛出异常(默认情况下)。问题解决了。