Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++;? 我是C++新手。我已经在下面的代码中了解了构造函数和析构函数在C++中如何工作。 #include<iostream> using namespace std; class Line { private: Line(); public: int length; static void getInstance(Line* objLine); ~Line(); }; void Line::getInstance(Line* objLine) { if(objLine == NULL) { objLine = new Line(); } } Line::Line() { cout<<"In the Constructor"<<endl; } Line::~Line() { cout<<"In the Destructor"<<endl; } int main() { Line* objLine = NULL; Line::getInstance(objLine); return 0; } #包括 使用名称空间std; 班级线 { 私人: 第()行; 公众: 整数长度; 静态void getInstance(行*objLine); ~Line(); }; void行::getInstance(行*objLine) { if(objLine==NULL) { objLine=新行(); } } 行::行() { C++中的CUT,当变量超出范围时调用析构函数,或在< 新< /COD> < < /P>创建的对象上调用删除>代码> >_C++_C++11 - Fatal编程技术网 < < /P>创建的对象上调用删除>代码> >,c++,c++11,C++,C++11" /> < < /P>创建的对象上调用删除>代码> >,c++,c++11,C++,C++11" />

在C++;? 我是C++新手。我已经在下面的代码中了解了构造函数和析构函数在C++中如何工作。 #include<iostream> using namespace std; class Line { private: Line(); public: int length; static void getInstance(Line* objLine); ~Line(); }; void Line::getInstance(Line* objLine) { if(objLine == NULL) { objLine = new Line(); } } Line::Line() { cout<<"In the Constructor"<<endl; } Line::~Line() { cout<<"In the Destructor"<<endl; } int main() { Line* objLine = NULL; Line::getInstance(objLine); return 0; } #包括 使用名称空间std; 班级线 { 私人: 第()行; 公众: 整数长度; 静态void getInstance(行*objLine); ~Line(); }; void行::getInstance(行*objLine) { if(objLine==NULL) { objLine=新行(); } } 行::行() { C++中的CUT,当变量超出范围时调用析构函数,或在< 新< /COD> < < /P>创建的对象上调用删除>代码> >

在C++;? 我是C++新手。我已经在下面的代码中了解了构造函数和析构函数在C++中如何工作。 #include<iostream> using namespace std; class Line { private: Line(); public: int length; static void getInstance(Line* objLine); ~Line(); }; void Line::getInstance(Line* objLine) { if(objLine == NULL) { objLine = new Line(); } } Line::Line() { cout<<"In the Constructor"<<endl; } Line::~Line() { cout<<"In the Destructor"<<endl; } int main() { Line* objLine = NULL; Line::getInstance(objLine); return 0; } #包括 使用名称空间std; 班级线 { 私人: 第()行; 公众: 整数长度; 静态void getInstance(行*objLine); ~Line(); }; void行::getInstance(行*objLine) { if(objLine==NULL) { objLine=新行(); } } 行::行() { C++中的CUT,当变量超出范围时调用析构函数,或在< 新< /COD> < < /P>创建的对象上调用删除>代码> >,c++,c++11,C++,C++11,使用new创建对象,但从不使用delete,因此从不调用析构函数 如果您的代码如下所示: int main() { Line objLine; } 析构函数被调用。在这种情况下,您需要清理自己的内存 int main() { Line* objLine = NULL; Line::getInstance(objLine); delete objLine; return 0; } 这是因为您使用了new来分配内存,因此它在超出范围后不会自动清理。您需要使用

使用
new
创建对象,但从不使用
delete
,因此从不调用析构函数

如果您的代码如下所示:

int main() {
   Line objLine;
}

析构函数被调用。

在这种情况下,您需要清理自己的内存

int main()
{
    Line* objLine = NULL;
    Line::getInstance(objLine);
    delete objLine;
    return 0;
}
这是因为您使用了
new
来分配内存,因此它在超出范围后不会自动清理。您需要使用
delete
来清理内存

如前所述,您还需要将
getInstance
函数更改为

void Line::getInstance(Line*& objLine)

作用域规则对自动分配(即局部变量)有效。相反,您使用
new
运算符动态分配
Line
的实例:

void Line::getInstance(Line* objLine)
{
    if(objLine == NULL)
    {
        objLine = new Line();
    }
}
动态分配的对象未绑定到作用域,必须使用
delete
运算符明确删除。此外,上述方法正在泄漏内存:一旦离开函数,您将丢失对新创建对象的任何引用,因此您将无法访问或
删除它。您需要要实际修改传递给您的指针,例如,按如下方式修改代码:

void Line::getInstance(Line** objLine)
{
    if(objLine == NULL)
    {
        *objLine = new Line();
    }
}
此时,您可以像这样使用它:

int main()
{
    Line* objLine = NULL;
    Line::getInstance(&objLine);
    // do something...
    delete objLine;
    return 0;
}

objLine
main
结束时超出范围,但
objLine
不是
Line
的实例,它只是一个指针。因此指针在
main
结束时超出范围。它没有析构函数。如果您编写了
Line objLine
,则析构函数将作为
objLine执行超出范围。对于教育之外的软件,我建议使用共享指针,当变量超出范围时调用析构函数。实际上,这不起作用。
objLine
通过值传递给
getInstance
,它不会被修改,因此
delete objLine
实际上将是一个call to
delete NULL
,这会导致一个no op。
作用域规则对静态分配有效
实际上,静态分配的对象不会在作用域结束时被销毁。它们在
main
返回后被销毁。您可能指的是自动(堆栈)分配。@User207933我指的是静态(在编译时)与动态(如在运行时)相反,是的,自动更正确,我也相应地编辑了这篇文章。我认为“自动存储”对新手来说可能听起来有点奇怪。