我对以下代码有疑问,在析构函数中有一个析构函数delete line[],我只想知道此删除是否有任何堆栈溢出,这可能是递归调用析构函数的结果。

class Line {
public:
    char *line;
    Line(const char *s = 0) {
        if (s) {
            line = new char[strlen(s)+1];
            strcpy(line, s);
        } else {
            line = 0;
        }
    }

    ~Line() {
        delete[] line; //----------> how this delete will work?
        line = 0;
    }

    Line &operator=(const Line &other) {
        std::cout <<"go"<< endl;
        delete[] line; //----------> purpose of using this delete??
        line = new char[other.len()+1];
        strcpy(line, other.line);
        return *this;
    }

    int operator<=(const Line &other) {
        int cmp = strcmp(line, other.line);
        return cmp <= 0;
    }

    int len() const {
        return strlen(line);
    }
};





int main() {
Line array[] = {Line("abc"), Line("def"),
                Line("xyz")};
   Line tmp;
  }

重载的赋值运算符内部的删除是在分配新内存之前清理内存(我已经在某处读取了内存,如果我写错了,请更正),但是此删除是否会调用析构函数?

请解释

最佳答案

不,不会。

此delete语句将删除char数组。仅在销毁Line对象时才调用Line的析构函数。但是,这里不是这种情况。

变量行和对象/类行是不同的东西。

line变量是Line类中的成员变量。因此,这两个名称看起来相同,但完全不同。

关于c++ - 在C++中的析构函数中调用delete [],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47904269/

10-13 06:29