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;
}
我是否将析构函数称为错误,还是我执行它?或者是他缺少的一点?在程序退出之前基本上获得一个内存映射。
答案 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();你自己。它将在该类变量的范围结束后自动调用。