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

C++ c++;-类的对象何时分配动态内存?,c++,class,pointers,object,dynamic-memory-allocation,C++,Class,Pointers,Object,Dynamic Memory Allocation,我想知道类的对象何时分配动态内存。以下面的语句为例,处理一个名为“test”的类: 我怀疑只有第一行在动态内存中创建了一个对象(因此最终必须由程序员释放),而第二行由于缺少关键字“new”(并且不必由程序员释放),只在堆栈内存中创建了一个对象。您的示例大致正确 试验*pd=新试验(2) new关键字将使编译器在堆上为新的测试对象分配内存。这相当于在C语言中调用malloc(size)。在没有隐式垃圾收集器的语言(如C和C++)中,您随后负责删除对象 在某些短期运行的程序中,您可以不删除该对象,因

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


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

您的示例大致正确

试验*pd=新试验(2)

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

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

同样重要的是不要考虑
test*pd=newtest(2)将测试对象存储在*pd指针中。指针只指向它,以后可以使指针指向其他对象。指针与新的测试对象无关,只是现在它正好指向它

试验ob(2)


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

您的理解是正确的。(尽管有些人可能会争辩说标准根本没有提到“stack”一词。)在您的示例中,第二个可能是在stack上分配的,也可能是在静态内存中分配的。通常,如果它在函数内部,则在堆栈上分配,否则在全局范围内,在静态内存中分配。您还可以使用
malloc
calloc
realloc
动态分配内存。C++还包含了一系列类:<代码>操作符new < /C>和<代码>运算符new []:代码> <代码> STD::UngQuyPPTR < /C>和 STD::SysDypPTR ,几乎不需要直接使用:<代码> new < /C>,<代码> new []/COD>,<代码> MALLC/<代码>在现代C++中,代码>代码> >代码>或>代码> ReLoCu。在第一行中,对象不存储在指针中。对象存储在免费存储中。指针保存空闲存储中对象的地址。是否可能重复?至少,绝对值得一读。
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 (?)