C++ 在c++;

C++ 在c++;,c++,memory-management,memory-leaks,destructor,assignment-operator,C++,Memory Management,Memory Leaks,Destructor,Assignment Operator,我对下面的代码有疑问,在析构函数内部有一个析构函数delete line[],我只想知道这个删除是否有堆栈溢出,这可能是递归调用析构函数的结果 class Line { public: char *line; Line(const char *s = 0) { if (s) { line = new char[strlen(s)+1]; strcpy(line, s); } else {

我对下面的代码有疑问,在析构函数内部有一个析构函数
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;
  }
类行{
公众:
字符*行;
行(常量字符*s=0){
若有(s){
行=新字符[strlen(s)+1];
strcpy(行,s);
}否则{
直线=0;
}
}
~Line(){
删除[]行;//-->此删除将如何工作?
直线=0;
}
行和运算符=(常量行和其他){

std::cout
delete[]行;
将构造函数和赋值运算符中的
new char[strlen(s)+1];
语句配对。请注意
delete[]如果
line
被设置为
nullptr
,则line;
是不可操作的,这是
else
分支分配所做的,尽管它草率地使用
0
代替
nullptr

请确保析构函数不是递归调用的。它只是用来释放任何分配的内存

<>但是使用<代码> STD::/Cux>作为类成员变量,或者甚至整个类本身将是远的,更容易的。代码中存在一些微妙的错误——自赋值是其中之一,并且缺少复制构造函数。让C++标准库为您处理这些。总之,您可以编写

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

delete[]
的参数是一个
char*
,即没有调用析构函数(也没有递归调用析构函数)

如果你有这样一个析构函数:

 ~Line() { delete this; }   // DONT DO THIS !!! (also for other reasons it is not OK at all)
这将尝试递归地调用自身,但您的代码看起来很好

在赋值运算符中

line = new char[other.len()+1];
将分配新内存,并将指针(指向此内存)分配到
。这将导致您不再拥有旧内存的句柄,并且为了避免泄漏,您需要在之前将其删除。

不,不会

此delete语句将删除char数组。只有在销毁Line对象时才会调用Line的析构函数。但这里的情况并非如此

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


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

C++默认负责删除[]对于char*,因此您无需执行任何操作。

是指向没有析构函数的
char
的指针。对其调用
delete
,将释放您分配的内存,仅此而已。正如答案所述,没有递归。但是,如果有人执行此操作,您的复制分配代码就会出现问题de>Line l(“Hello World”);Line*p=&l;l=*p;
。这是一种自赋值,并且出现了可怕的错误。最好的解决方案是:1.编写一个合适的复制构造函数。2.为Line编写std::swap的专门化。3.复制赋值按值进行
other
,只执行
std::swap(*这个,其他);return*this;
。如果您的交换不是抛出(应该是抛出),那么这将提供强大的异常保证。
如果对象不是使用新表达式创建的,则删除此
将导致未定义的行为。