c - 更好的方式来分配内存以获得灵活性和处理
问题描述
不同的程序员有不同的编码风格。我和同事正在研究图像数据处理,我们有 3 种不同的方法。
同事1:
int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;
char* colleague1_way() //just allocate when he wants
{
char* mem = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);
return mem;
}
int main(void)
{
char* data;
data=colleague1_way();
function1(data); //pass by pointer
function2(data); //pass by pointer
function3(data); //pass by pointer
free(data);
}
同事2:
int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;
char* data; //set it as global memory
void colleague2_way()
{
data = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);
}
int main(void)
{
colleague2_way();
function1(); //void input, proceed data inside function
function2(); //void input, proceed data inside function
function3(); //void input, proceed data inside function
free(data);
}
我:
int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;
int main(void)
{
char* data = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);
function1(data); //pass by reference
function2(data); //pass by reference
function3(data); //pass by reference
free(data);
}
我的想法是
- 我可以清楚地看到分配的内存,并在 main() 结束时释放它。
- function1~3 可能在另一个 cpp 文件中,所以很容易处理。
任何人都可以给我评论,有没有更好的方法?另外,如果它是用 C++ 编写的,有什么好的方法吗?
解决方案
首先说一下“Colleague2”方式:全局声明char
指针data
在真正需要之前,您应该避免全局声明变量。在这里,我看不到任何data
全局声明指针的理由。由于它对其他函数可见,因此它的范围增加了,并且可能会被其他不希望的代码部分意外修改。
“Colleague1”和“Me”方式:
在这两种方式中,一个好处是data
指针的范围是有限的。但是在“Colleague1”方式中,内存分配操作是另一个函数的一部分,这实际上很好,因为您可以在一个地方进行内存分配错误处理(这在所有方面都缺失3
)。考虑一种情况,您需要在代码的其他部分分配相同大小的内存,然后您只需要调用此函数而不是再次执行malloc
. 如果您确定不需要再次分配相同大小的内存,那么在这种情况下,“我”方式也可以。因此,在这两种方式中,请遵循适当的方式,但请确保执行所需的错误处理。
推荐阅读
- excel - 数据透视表颜色问题
- django - Nginx/uWSGI/Django 堆栈中的域名替换为上游名称
- mysql - MySQL 8.0 Ubuntu 服务器在移动 datadir 后无法启动
- php - 如何仅复制此 PHP 数组中的值,而不是结构?
- postgresql - 按赞成票对 LTree 排序
- apache-spark - 如何从 Spark 中的文本文件创建 dataFame
- passport.js - 从链接获取 oauth_token 和 oauth_verifier
- javascript - 更新一个
- angular8 - 通过httpInterceptor angular 8缺少http请求
- python - 所有熊猫行到单行的欧几里得距离