【问题标题】:c++ - When do objects of classes allocated dynamic memory?c++ - 类的对象何时分配动态内存?
【发布时间】:2018-03-19 01:21:08
【问题描述】:

我想知道类的对象何时分配动态内存。采取以下语句,处理一个名为“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”而只在堆栈内存中创建一个对象(并且不必由程序员释放)。

【问题讨论】:

  • 你的理解是正确的。 (尽管有些人可能会争辩说该标准根本没有提到“堆栈”这个词。)
  • 在您的示例中,第二个可能分配在堆栈或静态内存中。通常,如果 this 在函数内部,则在堆栈上分配,否则在全局范围内,在静态内存中。
  • 您也可以使用malloccallocrealloc动态分配内存。 C++还有一堆封装operator newoperator new[]的类,比如std::unique_ptrstd::shared_ptr,几乎不需要直接使用:newnew[]malloccalloc或现代 C++ 中的 realloc
  • 在第一行中,对象没有存储在指针中。对象存储在免费存储中。指针保存对象在空闲存储区的地址。
  • 可能重复?至少,绝对值得一读。 stackoverflow.com/questions/10157122/…

标签: c++ class pointers object dynamic-memory-allocation


【解决方案1】:

您的示例大致正确。

test* pd = new test(2);

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

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

同样重要的是不要将test*pd = new test(2); 视为在 *pd 指针中存储测试对象。指针只是指向它,以后可以让指针指向其他东西。指针与新的测试对象无关,只是它现在恰好指向它。

测试 ob(2);

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

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2012-05-04
    • 2015-12-07
    • 2015-06-27
    相关资源
    最近更新 更多