在C ++中破坏struct array成员

时间:2012-11-07 04:34:59

标签: c++ destructor

我有关于析构函数的问题。在main.cpp下面,如果我将ht定义为指针,程序运行正常。但是如果我将ht定义为一个对象,它将抛出一个错误

对象0x7fff511a4b00的

" malloc: *错误:未分配被释放的指针 * 在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

2 个答案:

答案 0 :(得分:2)

您无需拨打delete[] h_table;,因为您在<{1}}中没有任何内容。您的代码是未定义的行为。

您的测试没有崩溃的原因是因为您只有Hash_Table但没有new ht

delete ht

答案 1 :(得分:0)

仅通过“new []”分配时使用“delete []”。仅通过“新”分配时使用“删除”。在任何其他*情况下,请勿删除该对象。在您的情况下,h_table处于堆栈状态,因此操作系统将负责处理。