匿名对象何时从内存中删除以及何时建议使用它们?

Asi*_*sim 3 c++

我是 C++ 新手,我试图了解构造函数和析构函数以及有关内存管理的一些知识。在下面的代码中,除了

1.MyClass().disp(); 2.新增我的班级;3.new MyClass(300);

1)我想知道将这三个对象称为匿名对象是否正确。2)对于MyClass(),我理解这会创建一个对象并立即销毁它,因此不存在内存问题。但对于 new MyClass() ,析构函数永远不会被调用。我还明白,因为这是在堆上,所以我必须显式删除该对象。但在这种情况下我该怎么做呢?
如果不可能,程序执行后内存什么时候会释放?3)我还想知道这种类型的对象创建(new MyClass)在什么情况下有用。

#include<iostream>
#include<conio.h>
using namespace std;

class MyClass
{
private:
    int num;
public:
    MyClass()
    {
        cout<<"no-arg constructor"<<endl;
    }
    MyClass(int num)
    {
        this->num=num;
        cout<<"one param constructor"<<endl;
    }
    ~MyClass()
    {
        cout<<"inside destructor\t"<<num<<endl;
    }
    void disp()
    {
        cout<<num<<endl;
    }
 };

int main()
{
    MyClass m1;
    MyClass m2(200);

    MyClass *m3=new MyClass;
    MyClass *m4=new MyClass(400);

    MyClass().disp();
    new MyClass;
    new MyClass(300);

    delete m4;
    delete m3;
    return 0;

} 
Run Code Online (Sandbox Code Playgroud)

Che*_*Alf 5

“匿名对象”不是一个标准术语,而是一个描述性术语。我会把它解释为一个没有名字的物体。有名称的对象称为变量或数据成员。

  1. 在表达式中,您正在调用class 的临时对象MyClass().disp()成员函数。临时对象的生命周期延伸[1]到完整表达式的末尾。如果我没记错的话,在 C++ 标准中,它被称为完整表达式dispMyClass

  2. -new表达式new MyClass为新MyClass对象分配内存,并MyClass在该内存块中创建一个新对象。该表达式生成一个指向新对象的指针。您可以将该指针存储在变量中,并在稍后的delete表达式中使用它来销毁对象并释放其内存。

  3. 除了为构造函数提供了参数之外,表达式new MyClass(300)是相同的MyClass。-new表达式语法还提供了一种表示法来指定分配操作的参数。但这是更高级的,很少需要,而且无论如何,作为初学者,您应该优先不要使用 rawnewdelete,而是使用标准库容器和字符串。

delete如果a没有对应的new对象,则该对象将一直存在到程序执行结束。如果这是一台带有操作系统的机器,那么操作系统将回收内存。但是,操作系统对 C++ 对象一无所知,因此不会调用对象析构函数,因此不会执行析构函数中指定的清理。

你问哪里new有用。通常,当对象的所需生存期不适合范围(本地自动变量的嵌套生存期)时,和/或需要动态大小的对象时。对于 C++11 及更高版本中的有效可移动对象来说,用于new控制生命周期并不是什么问题,并且对于动态大小,优先使用容器(例如 )std::vector和字符串(例如std::string.

[1]更一般地,临时对象可以直接绑定到本地引用,在这种情况下,其生命周期将延长到引用的生命周期,即超出封闭块的生命周期。