首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C中创建“类”,在堆栈上还是在堆上?

在C中创建“类”,在堆栈上还是在堆上?
EN

Stack Overflow用户
提问于 2015-07-28 10:00:58
回答 12查看 6.2K关注 0票数 48

每当我看到一个C“类”(任何用于访问以指向它的指针作为第一个参数的函数的结构)时,我都会看到它们的实现方式如下:

代码语言:javascript
运行
复制
typedef struct
{
    int member_a;
    float member_b;
} CClass;

CClass* CClass_create();
void CClass_destroy(CClass *self);
void CClass_someFunction(CClass *self, ...);
...

在本例中,CClass_create总是malloc的内存,并返回指向该内存的指针。

每当我看到new不必要地出现在C++上时,它通常看起来会让C++程序员发疯,但这种做法在C中似乎是可以接受的。为什么堆分配的结构“类”如此常见有什么原因吗?

EN

Stack Overflow用户

发布于 2015-07-28 10:13:44

假设,就像在您的问题中一样,CClass_createCClass_destroy使用malloc/free,那么对于我来说,以下操作是错误的做法:

代码语言:javascript
运行
复制
void Myfunc()
{
  CClass* myinstance = CClass_create();
  ...

  CClass_destroy(myinstance);
}

因为我们可以很容易地避免一个malloc和一个自由:

代码语言:javascript
运行
复制
void Myfunc()
{
  CClass myinstance;        // no malloc needed here, myinstance is on the stack
  CClass_Initialize(&myinstance);
  ...

  CClass_Uninitialize(&myinstance);
                            // no free needed here because myinstance is on the stack
}

使用

代码语言:javascript
运行
复制
CClass* CClass_create()
{
   CClass *self= malloc(sizeof(CClass));
   CClass_Initialize(self);
   return self;
}

void CClass_destroy(CClass *self);
{
   CClass_Uninitialize(self);
   free(self);
}

void CClass_Initialize(CClass *self)
{
   // initialize stuff
   ...
}

void CClass_Uninitialize(CClass *self);
{
   // uninitialize stuff
   ...
}

在C++中,我们也宁愿这样做:

代码语言:javascript
运行
复制
void Myfunc()
{
  CClass myinstance;
  ...

}

比这更重要:

代码语言:javascript
运行
复制
void Myfunc()
{
  CClass* myinstance = new CCLass;
  ...

  delete myinstance;
}

以避免不必要的new/delete

票数 14
EN
查看全部 12 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31673065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档