【问题标题】:Would like to destroy the stack that I made想销毁我制作的堆栈
【发布时间】:2021-11-03 11:36:10
【问题描述】:

所以,在课堂上,我们了解了数组抽象数据结构的实现,并使用我们制作的数组类,将堆栈抽象数据结构实现为一个类。

#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 类中,我们显式使用了 delete 方法,但在 StackADT1 类中我们没有这样做。之后堆栈是否也会被销毁

return 0;

被调用?

【问题讨论】:

  • newdelete配对,StackADT1不使用new所以它也不需要调用delete
  • 令人耳目一新的内存管理并没有完全错误。你的代码是一个很好的例子,它将内存管理分离到一个除了这个之外什么都不做的类中,实际的堆栈类不需要担心手动搞乱newdelete
  • ArrayADT1 应该实现五规则,之后Stack 将免费获得其所有功能。还可以考虑使用一个参数明确的 ctors。
  • 免费的代码审查godbolt.org/z/Ta96xhf3K

标签: c++ class destructor abstract-data-type


【解决方案1】:

在 ArrayADT1 类中,我们显式使用了 delete 方法,但在 StackADT1 类中我们没有这样做

您还在 ArrayADT1 类中显式使用了 new-expression,但未在 StackADT1 中使用 new-expression。这是意料之中的,因为我们只删除了新的内容。

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

该析构函数的主体中没有任何事情发生,因为主体是空的。析构函数会销毁(空)体之后的子对象。


ArrayADT1 是可复制的,但复制它会导致未定义的行为。这是不好的。要修复它,请遵循五规则。我还建议学习 RAII 成语。示例程序在实施 RAII 方面似乎存在缺陷。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多