想销毁我制作的堆栈

Would like to destroy the stack that I made

所以,在class中,我们学习了一个数组抽象数据结构的实现,利用我们制作的数组class,我们实现了一个栈抽象数据结构作为一个class.

#include <iostream>
#ifndef ARRAYADT1_H
#define ARRAYADT1_H

using namespace std;

class ArrayADT1
{
    public:
        ArrayADT1();
        ArrayADT1(int);
        virtual ~ArrayADT1();
        bool setElement(int, int);
        int getElement(int);
        int getCapacity();
    protected:

    private:
        int capacity;
        int* elements;

};

#endif // ARRAYADT1_H


ArrayADT1::ArrayADT1(){
    capacity=0;
    elements=NULL;
}

ArrayADT1::ArrayADT1(int arraySize){
    capacity=arraySize;
    elements=new int[arraySize];
}

bool ArrayADT1::setElement(int index, int value){
    elements[index]=value;
    return(true);
}

int ArrayADT1::getElement(int index){
    return(elements[index]);
}

int ArrayADT1::getCapacity(){
    return(capacity);
}

ArrayADT1::~ArrayADT1(){
    delete[] elements;
}
#ifndef STACKADT1_H
#define STACKADT1_H

using namespace std;

class StackADT1
{
    public:
        StackADT1()=delete; //disable creation of stack without specifying capacity
        StackADT1(int); //create stack of capacity
        bool push(int);
        int pop();
        bool isFull();
        bool isEmpty();
        int length();
        virtual ~StackADT1();

    protected:

    private:
        int ValueCount;
        ArrayADT1 members;

};

#endif // STACKADT1_H

#include <iostream>

StackADT1::StackADT1(int stackCapacity): members(stackCapacity){
    ValueCount=0;
}

int StackADT1::length(){
    return(ValueCount);
}

bool StackADT1::isEmpty(){
    if(ValueCount==0)
        return(true);
    return(false);
}

bool StackADT1::isFull(){
    if(ValueCount==members.getCapacity())
        return(true);
    return(false);
}

int StackADT1::pop(){
    if(isEmpty()){
        cout<<"The Stack is empty"<<"\n";
        return(-1);
    }
    ValueCount--;
    return(members.getElement(ValueCount));
}

bool StackADT1::push(int value){
    if(isFull()){
        cout<<"The stack is full"<<"\n";
        return(false);
    }
    members.setElement(ValueCount, value);
    ValueCount++;
    return(true);
}

StackADT1::~StackADT1(){
    //I would like to know what happens here
    //dtor



}

我想知道这两种情况下的析构函数。在 ArrayADT1 class 中,我们明确使用了删除方法,但在 StackADT1 class 中我们没有这样做。

之后堆栈是否也被销毁
return 0;

叫什么?

In the ArrayADT1 class, we explicitly used the delete method, but we do no such thing in the StackADT1 class

您还在 ArrayADT1 class 中明确使用了 new 表达式,但您没有在 StackADT1 中使用 new 表达式。这是意料之中的,因为我们只删除新的内容。

//I would like to know what happens here
//dtor

析构函数的主体没有任何反应,因为主体是空的。析构函数将在(空)主体之后销毁子对象。


ArrayADT1 是可复制的,但复制它会导致未定义的行为。这是不好的。要修复它,请遵循五法则。我还建议学习 RAII 习语。示例程序在实施 RAII 时似乎是一个有缺陷的尝试。

接下来,我建议学习 std::unique_ptr,这是管理内存的更好方法。