2016-11-15 29 views
0

我編寫了一個簡單的Buffer類,它包含一個緩衝區並提供了一個函數來反轉緩衝區的內容。在這個類中是否有任何雙重風險

Buffer.h

#ifndef __BUFFER_H__ 
#define __BUFFER_H__ 

#include <stdlib.h> 
#include <cerrno> 
#include <stdio.h> 

class Buffer 
{ 

private: 
    char * buffer; 
    int size; 


public: 
    Buffer(int size); 
    ~Buffer(); 
    void reverse(int size); 

}; 

#endif 

Buffer.cc

#include "Buffer.h" 


Buffer::Buffer(int size) 
{ 
    this -> size = size; 
    this -> buffer = (char *)malloc(size); 
    if(this -> buffer == NULL) 
    throw 1; 
} 

Buffer::~Buffer() 
{ 
    if(this -> buffer != NULL) 
    free(this -> buffer); 
} 

void Buffer::reverse(int size) 
{ 
    char tmp; 
    int i; 
    char * tmpb = this -> buffer; 
    for(i = 0; i < size/2; i++) 
    { 
    tmp = (char)tmpb[i]; 
    tmpb[i] = tmpb[size - i - 1]; 
    // printf("exchange %x with %x\n", tmp & 0xff, tmpb[i] & 0xff); 

    tmpb[size - i - 1] = tmp; 
    } 
} 

有一個遠程服務器使用故障注入來測試我的實現。該服務器給我報告說有雙重空閒或腐敗引起的錯誤。我已經多次閱讀我的實現,但沒有找到該錯誤的運氣。我沒有訪問該服務器。任何幫助?我不得不使用C風格的代碼。否則,我會失敗的服務器測試。這是一個很難的要求。那麼,你可能會認爲這個要求很愚蠢。但這是要求。也許有一點是在混合C和C++的時候學習壞的。

服務器提供了一個主函數來測試我的實現。

對於任何想要查看所有代碼的人,可以從https://mega.nz/#!FhoHQD5Y!iD9tIZMNtKPpxfZTpL2KWoUJRedbw6wToh6QfVvzOjU下載zip文件。只需使用make進行編譯。其結果是名爲的程序,該程序逐字節地反轉文件的內容,然後輸出到新文件。

+2

這是應該做什麼,'std :: vector'與'std :: reverse'完成不了嗎? –

+1

不完全相關,但爲什麼在C++代碼中使用'malloc','free'和C-style轉換? – UnholySheep

+3

確實存在雙重的免費風險。你沒有定義複製構造函數。閱讀有關[什麼是三條規則?](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)。除此之外,爲什麼你在你的C++代碼中使用'malloc','free'而不是'new'和'delete'? –

回答

1

考慮禁止顯式複製,如果允許編譯器生成隱式拷貝構造函數,那麼它可以通過共享緩衝區指針的兩個對象釋放兩次。否則,我認爲不可能發生雙重自由。爲此,您可以在C++ 11這樣的:

class Buffer { 
private: 
    char *buffer; 
    int size; 

public: 
    Buffer(int size); 
    Buffer(const Buffer &) = delete; 
    Buffer &operator=Buffer(const Buffer &) = delete; 
    ~Buffer(); 
    void reverse(int size); 

}; 

一些小筆記:

1.

free(NULL)由標準定義爲一個無操作。所以

if(this -> buffer != NULL) 
    free(this -> buffer); 

可以只是:

free(this -> buffer); 

2.

tmp = (char)tmpb[i]; 

爲什麼在這裏投? tmpb[i]應該已經是char。作爲一般的經驗法則,大多數時候你覺得需要投射,這可能意味着有更好的方法來完成這項任務。當然也有例外,但乾淨的代碼應該具有最少的投射。

3.

任何理由不只是使用std::swap(tmpb[size - i - 1], tmpb[i])你的反向功能裏面?

相關問題