【问题标题】:Misunderstand how a destructor works?误解了析构函数的工作原理?
【发布时间】:2014-04-05 03:37:19
【问题描述】:

classy.h

struct Stack{ 
    int *arr;
    int numElements;
    int capacity;
};

class Point { 

private: 
 Stack *newStack;
public: 
  Point (int cap); 
  int returncap (); 
  ~Point(); 
}; 

我认为问题不是 h 文件,而是两个 cc 文件之一

classy.cc

    #include <iostream> 
    #include "classy.h"

    using namespace std;

    Point::Point(int cap){
        newStack = new Stack;
        newStack->numElements = 0;
        newStack->arr = new int [cap];
        if(newStack->arr == NULL) {
        newStack->capacity = 0;
        }
        else {
        newStack->capacity = cap;
        }
    }

    Point::~Point(){ 
        delete newStack->arr;
        delete newStack;
    } 

    int Point::returncap() {
        return newStack->capacity;
    }

ma​​in.cc

#include <iostream> 
#include "classy.h"

using namespace std;


int main() { 
  int x;
  cout << "Please insert cap: "<< endl;
  cin >> x;
  Point p (x); 
  cout << p.returncap();
  p.~Point(); 
  return 0; 
} 

我是错误地调用了析构函数还是它是我的实现?还是我错过了他们的某些观点?基本上在程序退出之前得到一个内存映射。

【问题讨论】:

  • 你不应该显式调用析构函数并且你不应该在这里使用指针(使用std::vector&lt;int&gt;和Stack而不是指针),但是当你这样做时,您必须匹配 new 和 delete 上的方括号。
  • 如果你使用new[]分配你需要使用delete[]。
  • 抱歉忘记删除时的 [] 是我的一个坏习惯
  • @Pipsydoodles - 更好的习惯是使用 STL
  • 我看到您刚刚编辑了您的帖子以解决问题...我认为最好不要这样做,因为现在看到此线程并想知道答案在说什么的人会感到困惑。

标签: c++ class object


【解决方案1】:

这是错误的,在 main() 中:

p.~Point();

在 C++ 中,您几乎不需要显式调用析构函数。相反,当“自动”(堆栈,分配的默认类型)变量超出范围时,或者当您在使用new 分配的东西上调用delete 时,它们被称为“自动”。唯一一次显式调用析构函数是在使用“placement new”显式构造对象时......这是大多数程序员从不做的事情。

删除上面的行,您的代码应该可以更好地工作。

【讨论】:

    【解决方案2】:

    这一行

     delete newStack->arr;
    

    应该是

    delete[] newStack->arr;
    

    并删除这一行

    p.~Point();
    

    如果new 返回 NULL(尝试 nullptr),那么你真的是在没有特定设备的情况下走上一条小河

    【讨论】:

      【解决方案3】:

      你不需要调用析构函数 p.~Point();你自己。它将在该类变量的作用域结束后自动调用。

      【讨论】:

        猜你喜欢
        • 2015-10-24
        • 2014-10-29
        • 1970-01-01
        • 2017-03-20
        • 2016-02-20
        • 2012-12-11
        • 2011-02-18
        • 2018-02-17
        • 1970-01-01
        相关资源
        最近更新 更多