代码之家  ›  专栏  ›  技术社区  ›  Inertial Ignorance

c++-类的对象何时分配动态内存?

  •  0
  • Inertial Ignorance  · 技术社区  · 6 年前

    我想知道类的对象何时分配动态内存。使用以下语句处理一个名为“test”的类:

    test* pd = new test(2); // Creating a test object on the free store, and storing it in a pointer.
    
    test ob(2); // Creating a test object, in stack memory (?)
    

    我怀疑只有第一行在动态内存中创建了一个对象(因此最终必须由程序员释放),而第二行由于缺少关键字“new”(并且不必由程序员释放),只在堆栈内存中创建了一个对象。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tom    6 年前

    你的例子大致正确。

    试验*pd=新试验(2);

    new关键字将使编译器在堆上为新的测试对象分配内存。这相当于在C语言中调用malloc(size)。在没有隐式垃圾收集器的语言(如C和C++)中,您将负责稍后删除对象。

    在一些短期运行的程序中,您可以不删除对象,因为在现代机器中,当您的进程退出时,进程分配的内存应该被释放。但这真的很不雅观,不应该成为你的习惯。

    同样重要的是不要去想 test*pd = new test(2); 将测试对象存储在*pd指针中。指针只指向它,以后可以使指针指向其他对象。指针与新测试对象没有任何关系,只是现在它恰好指向它。

    试验ob(2);

    这里,因为您没有使用new关键字或在堆上分配内存,所以编译器负责为对象分配内存,并在对象超出范围时将其删除或忘记。堆栈是实现这一点的一种普通方法,但我相信该方法在技术上依赖于编译器,并且可能存在某些特定编译器将变量存储在其他地方的情况。