我已经编写了John Conway的生命游戏的三维C实现。现在,我想确保代码不会出错。这篇来自yolinux.com的文章说
检查内存分配错误。如果没有分配,就无法释放它。
我的问题是,我真的应该每次都检查分配错误吗?这可能会大大降低我的代码速度。以下是摘录:
inline int golField_Init(golField* field, golAllocProc alloc,
golOptions options, uint dimx, uint dimy, uint dimz) {
field->dimx = dimx;
field->dimy = dimy;
field->dimz = dimz;
field->cells = alloc(sizeof(golCell**) * dimx);
field->options = options;
if (!field->cells) return 1;
int x, y, z;
for (x = 0; x < dimx; ++x) {
field->cells[x] = alloc(sizeof(golCell*) * dimy);
for (y = 0; y < dimy; ++y) {
field->cells[x][y] = alloc(sizeof(golCell) * dimz);
for (z = 0; z < dimz; ++z) {
golCell_Init( &field->cells[x][y][z], 0 );
}
}
}
return 0;
}
我真的应该在每次分配中检查分配错误吗这还需要我释放已分配的存储空间。
它不会大大降低代码的速度。是的,检查所有分配,如果不能分配,请优雅地退出。
是的,它还需要您释放分配的内存。欢迎使用C
:)
若您不想减少对分配的考虑,请使用带有垃圾收集器和异常的语言。首先,你不能自己解放记忆。如果不能分配内存(除非这不是您想要做的,因为例如,内存是在可选代码的一部分中分配的),那么第二个可以让您在一个地方捕获所有错误。
我真的应该在每次分配中检查分配错误吗?
是的,你应该。
这还需要我释放已经分配的存储空间。
不,不管是否检查错误,在任何情况下都应该这样做。
如果你害怕性能下降,那么就在内部循环之外进行内存管理。既然您现在是在初始化函数中执行此操作,那么应该没有问题。与调用内存分配器的成本相比,错误检查本身非常便宜。
简短回答:绝对是
长答案:
例如,根据您正在实现的内容,您可以立即分配所需的内存。。。这在性能等方面会更好
但始终检查分配错误,并始终释放您分配的内容(仅一次!)。
不这样做会导致几个负面方面中的任何一个:访问空指针、内存泄漏等——不稳定和易受攻击的软件是由。。。