【问题标题】:Destructor for pointer to fixed size array指向固定大小数组的指针的析构函数
【发布时间】:2011-11-28 13:55:35
【问题描述】:

假设我有一个带有两个私有变量的 C++ 类。一个固定大小的数组data,以及一个指向该数组的指针pnt

class MyClass
{
   private:
      double *pnt;
      double data[2];
   public:
      myClass();
      virtual ~MyClass();
      double* getPnt() const;
      void setPnt(double* input);
};

MyClass::MyClass()
{

   double * input;
   data[0] = 1;
   data[1] = 2;

   input= data;
   setPnt(input);
}

MyClass::~MyClass()
{
 delete this->pnt; // This throws a runtime error
}


void MyClass::setPnt(double * input)
{
   pnt = input;
}

double * MyClass::getPnt() const;
{
   return pnt;
}

int main()
{
   MyClass spam; // Construct object
   delete spam; // Error C2440: 'delete' cannot convert from 'MyClass' to 'void*'
}

这段代码有两个问题。首先,如果我尝试在对象上调用 delete,我会得到:

错误 C2440:“删除”无法从“MyClass”转换为“void*”

其次,如果我注释掉删除语句,我会收到一个实时错误,说明调试断言失败!还有这个:

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

然后我的问题是:对于具有指向私有固定大小数组的指针的类,我如何正确释放内存、写入/调用析构函数?

P.S 我不能使用vector 或类似的漂亮容器(因此提出了这个问题)。

【问题讨论】:

  • 这是一个类似的问题,但我们问的是不同的问题,因为我有一个私有静态数组:stackoverflow.com/questions/4748669/…
  • 我没有看到静态数组。我看到一个固定大小的数组

标签: c++ debugging pointers destructor


【解决方案1】:

我没有看到静态数组。我看到一个固定大小的数组。 data 的内存也作为对象的一部分分配。

您不能显式删除该类的成员:删除运算符将处理该实例是动态分配的IFF

 {
      MyClass x; // auto variable
 } // x destructor run, no delete operator

对比

 {
      MyClass* x = new MyClass(); // heap allocation variable
      delete x; // x destructor run, ::delete de-allocates from heap
 } 

【讨论】:

  • 为什么我不想显式删除指针。我不想释放分配给它的内存吗?
  • 我已经扩展了答案。简而言之;您只想删除您分配的内容。你分配data[2]:它是你班级的一部分(成员)。
  • 回答了问题的delete 部分,指针pnt 呢?我不需要delete,因为new 没有被使用吗?
  • @Elpezmuerto:没错。你不想delete 指针,因为你没有用new 分配它。 delete 语句的目标必须是您使用new 分配的内容。唯一的例外:指针为空。
  • 没错。而且,是的,这就是答案。 pnt 仅仅指向data,所以当我说你不应该释放data 时,这意味着你应该删除通过任何其他指向data 的指针。
【解决方案2】:

data 是一个子对象,当MyClass 实例消失时,它将被释放。编译器会将任何必要的代码插入到MyClass 析构函数中,以便在释放内存之前为所有子对象调用析构函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2010-12-21
    • 2015-05-24
    • 2019-06-20
    • 2013-10-19
    • 2014-11-10
    相关资源
    最近更新 更多