0

デストラクタに問題があります。以下のmain.cppで、htをポインターとして定義すると、プログラムは正常に動作します。しかし、htをオブジェクトとして定義すると、エラーがスローされます

"malloc:*オブジェクト0x7fff511a4b00のエラー:解放されるポインターが割り当てられませんでした*デバッグするためにmalloc_error_breakにブレークポイントを設定してください"

私はこのエラーを理解しており、私の解決策はhtをポインターとして定義することです。

私の質問は、htをオブジェクトとして直接定義できるかどうかです。答えが「はい」の場合、クラス定義をどのように変更すればよいですか。

ありがとう。

main.cpp

#include "copy_constructor.h"

int main()
{
  // Define ht as pointer works fine
  //Hash_Table<int>  *ht;
  //ht = new Hash_Table<int>;

  Hash_Table<int> ht;

  // keyed_structure<int> s;
  //  s.data_val = 10;

  return 0;
 }

copy_constructor.h

#ifndef COPY_CONSTRUCTOR_H
#define COYP_CONSTRUCTOR_H

#include <cstdlib>
#include <iostream>

const size_t MAX_SIZE = 3;

template<class D> struct keyed_structure
{
  size_t key_val;
  D data_val;
  bool empty_val;
};

template<class D> class Hash_Table
{
  public:
    // COnstructor
    Hash_Table() {
      //h_table = new keyed_structure<D> [MAX_SIZE];
      for (size_t index=0; index < MAX_SIZE; ++index) {
        h_table[index].empty_val = true;
      }
    }
    // Destructor
    ~Hash_Table() {
      //std::cout << "Do destruct" << std::endl;
      delete[] h_table;
    }

  private:
     keyed_structure<D> h_table[MAX_SIZE];
};

#endif
4

2 に答える 2

2

で何も新しくdelete[] h_table;なかったので、電話する必要はありません。あなたのコードは未定義の振る舞いです。Hash_Table

あなたのテストがクラッシュしない理由は、あなただけnew htがクラッシュしなかったからですdelete ht

  Hash_Table<int>  *ht;
  ht = new Hash_Table<int>;
  delete ht;  // if you did ht, it still crashes
于 2012-11-07T04:38:37.110 に答える
0

「new[]」を介して割り当てられた場合にのみ「delete[]」を使用してください。「新規」を介して割り当てられた場合にのみ「削除」を使用してください。その他の場合は、オブジェクトを削除しないでください。あなたの場合、h_tableはスタック上にあるので、OSがそれを処理します。

于 2012-11-07T04:39:46.600 に答える