在C程序中新建和删除

时间:2011-12-04 00:11:43

标签: c

我有以下算法在C

中实现new
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块来捕获异常。

3 个答案:

答案 0 :(得分:2)

您确定要在C中实现实现,而不是C ++吗?以下都是假设你真的想要C。

首先,C不知道关键字operator,并且您不能为函数指定带有两个单词的名称。因此,您需要为您的函数指定一个不同的名称,例如operator_new。鉴于您的函数显然只适用于int(在您的界面中无法提供有关类型的信息,并且您的示例实现为s int s分配了空间),我建议{{1相反(因为C没有构造函数,new_intsnew之间的区别是没有意义的)。或者,您可能希望传递有关要分配的类型大小的参数。你甚至可以传递一个指向你想要作为对象的“构造函数”调用的函数的指针(使用operator new接口)。

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

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;
}