2013-05-15 51 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风格的字符串;但也许'矢量'会更好。 –

相关问题