-3

このエラーは私を怒らせています...

プログラムを Valgrind すると、delete[]in 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;
}
4

4 に答える 4

1

エラーは「pack1 = pack2;」が原因です。main.cxx で

DataPackage::operator= を実装して修正します。

于 2013-05-15T18:22:53.997 に答える
0

を管理する代入演算子を実装する必要がありますm_data。自動生成された実装は、ポインターをコピーするだけで、ポイント先の配列をコピーしません。代入演算子は次のようになります。

DataPackage& DataPackage::operator=(const DataPackage &other) {
   setData(other.m_data, other.m_length);
   return *this;
}
于 2013-05-15T18:22:53.983 に答える
-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; を実行しています。

于 2013-05-15T18:22:11.847 に答える