-2

我做了一个单链表程序。

我想知道是否需要析构函数或默认析构函数可以正常工作?

class sll
{
    node*head;
    node*tail;
public:
    sll()
    {
        head=tail=0;
    }
    sll(const sll & obj1);
    void addtohead (int x);
    void addtotail (int x);
    int deletefromhead();
    int deletefromtail();
}
4

2 回答 2

6

默认析构函数只会释放 head 和 tail 的内存,因为 sll() 构造函数只会在对象 intilization 时将 head 和 tail 初始化为 0

它不适用于动态分配的节点。在您的类中实现以下代码。

~sll()
{
    node *p = head;
    while (head !=NULL)
    {
        head= head -> next;
        delete p;
        p=head;
    }
}
于 2013-11-05T07:42:50.757 回答
5

析构函数不是强制性的,除非您尝试开发 RAII 或好的代码。

如果你不包含析构函数,那么你会给使用你的类的人带来负担:他们需要知道你没有析构函数,并且他们必须在让它们超出范围或销毁它们之前删除节点.

考虑“ifstream”类。

void function(const char* filename) {
    if (!haveReadFile) {
        ifstream file(filename); // create 'file' and open filename.
        if (file.good()) {      // file opened.
            readFile(file);
            haveReadFile = true;
        }
    }
    // .. other stuff.
}

我们不需要在这里执行“file.close()”或进行任何其他清理。这一切都封装在我们与 istream 签订的合同中。当对象离开时,它做了正确的事情。

与 "std::string" 类似——你不必这样做

std::string greeting = "Hello, ";
greeting += username;
std::cout << greeting << std::endl;
greeting.freeMemory();

因为字符串有析构函数,所以合约不需要你主动管理它的资源。

所以:不管析构函数是否是强制性的——如果没有析构函数,当你的类超出范围时发生的行为是否有意义?会不会有内存泄漏?

于 2013-11-05T07:54:05.527 回答