2013-05-15 54 views
-3

這個錯誤讓我瘋了......C:雙人免費或損壞,無法找到錯誤

Valgrinding程序表明delete[]DataPackage::~DataPackage(40行)造成的問題。但是如果我刪除它,程序將會泄漏。 那麼,如何修復它,我做了什麼錯?

main.cxx

#include "main.h" // currently includes DataPackage.h only 

DataPackage aTestFunction(){ 
    return DataPackage("hello",5); 
} 

int main(){ 
    DataPackage pack1 = aTestFunction(), pack2 = aTestFunction(); 
    pack1 = pack2; 

    for(unsigned int i = 0; i < pack1.getLength(); i++){ 
    printf("0x%02x ", *(pack1.getData()+i)&0xff); 
    } 

    return 0; 
} 

DataPackage.cxx

#include "DataPackage.h" // defines only the class, and private members m_data (char*) and m_length (size_t), includes <cstdio> and <cstring> 

DataPackage::DataPackage(){ 
    m_data = NULL; 
    m_length = 0; 
} 

DataPackage::DataPackage(string data){ 
    m_data = NULL; 
    setData(data.c_str(),data.length()+1); 
} 

DataPackage::DataPackage(const char *data, size_t length) { 
    m_data = NULL; 
    setData(data,length); 
} 

DataPackage::DataPackage(const DataPackage &pack) { 
    m_data = NULL; 
    setData(pack.m_data,pack.m_length); 
} 

const char* DataPackage::getData(){ 
    return m_data; 
} 

void DataPackage::setData(const char *newdata,size_t newlength){ 
    char* tmpdata = new char[newlength]; 
    m_length = newlength; 
    memcpy(tmpdata,newdata,m_length); 
    delete[] m_data; 
    m_data = tmpdata; 
} 

size_t DataPackage::getLength(){ 
    return m_length; 
} 

DataPackage::~DataPackage() { 
    delete[] m_data; 
} 

回答

0

您需要實施一個分配操作員,該操作員管理m_data。自動生成的實現將只複製指針,而不是複製指向數組。賦值運算符可能如下所示:

DataPackage& DataPackage::operator=(const DataPackage &other) { 
    setData(other.m_data, other.m_length); 
    return *this; 
} 
+0

謝謝,這解決了它(也許有人會有類似的問題)。但是,在這種情況下,這可能是[切換到矢量](http://stackoverflow.com/a/16572382/1354246)的好主意。 –

-1

嘗試:

void DataPackage::setData(const char *newdata,size_t newlength){ 
    char* tmpdata = new char[newlength]; 
    m_length = newlength; 
    memcpy(tmpdata,newdata,m_length); 

    if (m_data) 
    { 
     delete[] m_data; 
    } 

    m_data = tmpdata; 
} 

從我看到你的拷貝構造函數M_DATA設置爲NULL和呼叫setData之後。在setData中你基本上在做delete [] NULL;

+1

將空指針值傳遞給'delete []' –

+0

我也是這麼想的。 [來源](http://stackoverflow.com/a/4190715/1354246) –

1

錯誤是由'pack1 = pack2;'引起的在main.cxx中

執行DataPackage :: operator =來修復它。

3

您忘記了Rule of Three並且沒有提供複印分配操作員。因此,當從另一個DataPackage中分配一個DataPackage時,兩者最終都會有一個指向同一緩衝區的指針,並且都試圖將其刪除。

我會拋棄該班,並使用std::stringstd::vector<char>來代替。

+0

std :: string非常有用,因爲後面包含的數據將包含二進制數據(並且不一定以'\ 0'結尾)。 –

+0

@ michi.0x5d:'string'處理任意二進制數據就好了,除非您嘗試將其轉換爲C風格的字符串;但也許'矢量'會更好。 –

相關問題