我有以下算法在C
中实现newvoid *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块来捕获异常。
答案 0 :(得分:2)
您确定要在C中实现实现,而不是C ++吗?以下都是假设你真的想要C。
首先,C不知道关键字operator
,并且您不能为函数指定带有两个单词的名称。因此,您需要为您的函数指定一个不同的名称,例如operator_new
。鉴于您的函数显然只适用于int(在您的界面中无法提供有关类型的信息,并且您的示例实现为s
int
s分配了空间),我建议{{1相反(因为C没有构造函数,new_ints
和new
之间的区别是没有意义的)。或者,您可能希望传递有关要分配的类型大小的参数。你甚至可以传递一个指向你想要作为对象的“构造函数”调用的函数的指针(使用operator new
接口)。
C也没有例外。您可能会使用void*
/ setjmp
来模拟它们,但是由于C不知道析构函数,因此它不会为您进行清理。但是,代码知道您的手工异常处理可能会通过longjmp
缓冲区链显式实现清理。但是,需要将这些setjmp缓冲区传递给您的函数,使用额外的参数或使用全局变量。总而言之,C中更好的选择是返回setjmp
,NULL
。但是,如果您坚持使用异常部分,那么您可以这样做(未经测试):
malloc
然后按如下方式调用该函数:
#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;
}
答案 1 :(得分:1)
C ++中典型的幼稚new
/ delete
实现:
void * operator new(std::size_t n) throw(std::bad_alloc)
{
void * const p = std::malloc(n);
if (!p) throw std::bad_alloc();
return p;
}
void operator delete(void * p) throw()
{
std::free(p);
}
在C ++ 11中,operator new()
的异常规范更改为“none”,noexcept
的异常规范更改为operator delete()
。
new
运算符的成人版本在投掷之前首先循环set_new_handler()
。
对齐保证遵循malloc()
。
答案 2 :(得分:0)
#include <exception>
void *operator new(unsigned int s)
{
void *block = malloc(s);
if(block == NULL)
throw std::exception("Not enough memory.");
memset(block, 0, s);
return block;
}