2011-12-04 47 views
-1

,我有以下的算法用C實現新新在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塊來捕獲異常。

+5

C也沒有運營商定義/超載... – Mysticial

+4

你似乎對**想說哪種語言感到困惑**。在開始編寫源代碼之前,這是一個重要的決定。 –

+0

標題中的C,標記中的C++ - 出錯了。 –

回答

2

你確定你想在C而不是C++中實現嗎?以下全部假設你真的想要C。

首先,C不知道關鍵字operator,而且你不能給一個函數命名帶兩個單詞。因此你需要給你的函數一個不同的名字,比如operator_new。鑑於你的函數顯然只適用於整數(在你的接口中沒有辦法提供有關類型的信息,並且你的示例實現爲sint s分配空間),所以我建議使用new_ints(因爲C沒有構造函數, newoperator new之間的區別是沒有意義的)。或者,您可能需要傳遞參數,告訴您要分配的類型的大小。你甚至可以傳遞一個指向你想作爲對象的「構造函數」的函數的指針(使用void*接口)。

另外C也沒有例外。你可能會用setjmp/longjmp來模擬它們,但是因爲C不知道析構函數,它不會爲你做清理工作。但是,知道您的手工異常處理的代碼可能會通過一系列setjmp緩衝區明確實施清理。然而,那些setjmp緩衝區需要傳遞給你的函數,或者使用額外的參數,或者使用全局變量。總而言之,C中更好的選擇是返回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; 
} 

的功能將被稱爲:

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 */ 
    } 
} 
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; 
} 
+1

不需要memset並拋出'const char [N]'? Owch。 – Puppy

+0

如果你想讓你新分配的塊爲零初始化,最好使用'calloc'而不是'malloc'和'memset'。原因是,如果新的內存必須直接從操作系統中獲得(而不是使用流程已經擁有的當前未使用的內存),那麼操作系統將它設置爲零(出於安全原因,否則如果可能包含數據另一個應用程序),這使明確的清除冗餘。我期望'calloc'的高質量實現只會將內存置零,如果操作系統尚未完成。 – celtschk