误解了析构函数的工作原理?

时间:2014-04-05 03:37:20

标签: c++ class object

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;
    }

main.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; 
} 

我是否将析构函数称为错误,还是我执行它?或者是他缺少的一点?在程序退出之前基本上获得一个内存映射。

3 个答案:

答案 0 :(得分:5)

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

p.~Point();

在C ++中,您几乎不需要显式调用析构函数。相反,他们被称为&#34;自动&#34;当一个&#34;自动&#34; (堆栈,默认的分配类型)变量超出范围,或者当您使用delete分配的内容上调用new时。你唯一一次明确地调用析构函数就是你使用&#34; placement new&#34;明确地构造对象......这是大多数程序员从未做过的事情。

删除上面的行,您的代码应该更好。

答案 1 :(得分:1)

这一行

 delete newStack->arr;

应该是

delete[] newStack->arr;

并删除此行

p.~Point();

此外,如果new返回NULL(尝试使用nullptr),那么在没有某个设备的情况下,你真的上了某条小溪

答案 2 :(得分:0)

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