gpt4 book ai didi

c - C程序中的新建和删除

转载 作者:行者123 更新时间:2023-11-30 18:43:27 24 4
gpt4 key购买 nike

我有以下算法来在 C 中实现新的算法

void *newinc(unsigned int s)
{
// allocate and align storage of size s

// handle failure via exception

// return pointer to storage
}

我有以下实现:

 void *newinc(unsigned int s)
{
int *p = (int *)malloc(s * sizeof(int));
return p;
}

我相信算法中提到的第一步和最后一步已经由程序实现了,我如何实现算法中的第二行://通过异常处理失败我相信 C 程序没有 try/catch block 来捕获异常。

最佳答案

您确定要使用 C 实现,而不是 C++ 吗?以下都是假设您确实想要 C 的情况。

首先,C 不知道关键字operator,并且您不能为函数指定包含两个单词的名称。因此,您需要为您的函数指定一个不同的名称,例如 operator_new。鉴于您的函数显然仅适用于整数(您的界面中无法提供有关类型的信息,并且您的示例实现为 s ints 分配空间),我建议改用 new_ints (由于 C 没有构造函数,因此 newoperator new 之间的区别没有实际意义)。或者,您可能希望传递有关您要分配的类型大小的参数。您甚至可以将指针传递给您想要作为对象的“构造函数”调用的函数(使用 void* 接口(interface))。

C 也不异常(exception)。您可以使用 setjmp/longjmp 来模拟它们,但是由于 C 不知道析构函数,因此它不会为您进行清理。然而,了解手工异常处理的代码可能会通过一系列 setjmp 缓冲区显式地实现清理。但是,需要使用额外参数或使用全局变量将这些 setjmp 缓冲区传递给您的函数。总而言之,C 中更好的选择是只返回 NULL,就像 malloc 所做的那样。但是,如果您坚持异常(exception)部分,则可以这样做(未经测试):

#include <setjmp.h>
#include <stdlib.h>

void* operator_new(size_t s, /* how many bytes to allocate */
jmp_buf env) /* the "exception" information */
{
void* block = malloc(s);
if (!block)
longjmp(env, 1); /* 1 is an "error code" */
return block;
}

该函数将被调用如下:

int main()
{
volatile jmp_buf env; /* I'm actually not sure if this has to be volatile,
but longjmp may mess up some non-volatile variables */
if (!setjmp(env)) /* try */
{
int* p = operator_new(10*sizeof int, env);
/* use p */
free(p)
}
else /* catch(...) */
{
/* handle the error */
}
}

关于c - C程序中的新建和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8372142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com