在免费商店中创建对象有什么用

What is the use of creating objects on the free store?

本文关键字:什么 创建对象 免费      更新时间:2023-10-16
void fun()
{
    A *a = new A;   //Here A is a class
}                   //a should be deleted in fun()'s scope
int main()
{
    fun();
    return 0;
}

创建的对象存在于自由存储区中,不能由 main(( 函数使用。为什么要在免费商店中创建对象。是的,我们可以将对象引用传递给 main 函数,但我们甚至可以传递对象的副本(即使不是使用 new 运算符创建的(。那么 new 和 delete 运算符的确切用途是什么?

简短的回答:在运行时分配内存。

有关更多信息,请考虑: http://www.cplusplus.com/doc/tutorial/dynamic/

在您的示例中,没有,并且不是一个好的做法使用动态分配。 当对象使用动态分配时有身份(或因其他原因无法复制(,以及对象的生存期与某些对象不对应预先确定的生命周期,如静态或自动。 动态分配也可用于复制昂贵,并且探查器显示复制是瓶颈;在这种情况下,使用动态分配和复制指针可能会消除瓶颈。 (但这应该在分析显示有必要之前,永远不要这样做。

好问题。通常,它不是必需的 - 明确地。当然,还有另一个答案说"在运行时分配内存"和类似的评论。但是你可以通过std::vector<>std::string等来实现同样的效果。他们会在适当的时候为你在幕后做所有记忆的事情。

这是new/delete的一个原因 - 实现一些类很有用。

您提到可以传递对象的副本。这可能有点昂贵,因此出于优化目的,值得用 new/delete 替换最昂贵的副本是值得的。有一些称为"分析器"的工具可用于识别哪些副本价格昂贵。

第三个原因是多态性。您可能有类似于Base* ptr = (foo>7) ? new Derived1 : new Derived2(foo);的代码,您事先不知道需要什么对象,只是它应该如何行为。由于 Derived1Derived2的大小通常无关,因此您只能在运行时知道需要多少内存。

重要原因是堆栈的工作原理。它只有推送和弹出操作。在你释放之后推送的所有内容之前,你不能在堆栈中发布某些东西。或者换句话说,如果某些东西从堆栈中释放出来,例如函数返回时函数调用的堆栈帧,那么堆栈中它上面的所有内存也会被释放(你最好确保它被正确破坏,见下文(。

程序通常需要独立于堆栈存储数据。有两种方法:在编译时分配内存(作为静态数据(,或在自由存储区(也称为堆(中分配内存。

当然可以有多个堆栈,事实上,当方便和有用时,通常也会这样做。但它是通过使用堆栈容器变量来完成的,类型为 std::stack ,然后将其用作仅用于数据的额外堆栈。常见的处理器架构每个进程/线程只有一个"本机"堆栈,用于函数调用和堆栈变量,这些额外的堆栈始终是独立的,由程序代码创建,只是与列表、映射等相同的普通数据结构。


关于你问题中的代码,需要指出的是,在现代C++,赤裸裸的new通常是不受欢迎的。您应该使用 RAII 机制,例如智能指针:

void fun()
{
    auto a = std::unique_ptr<A>{ new A };   // C++11 syntax
    // object is automatically destroyed when a goes out of scope, no leak
    // note: heap should be used like this only if there's a reason, including:
    // - A is big, and might conceivably overflow the stack
    // - ownership of object may get moved and outlive the unique_ptr
}        

以及您的具体问题">创建的对象存在于免费存储中,不能由 main(( 函数使用。为什么应该在免费商店中创建对象">,好吧,在问题代码中,它不应该在免费商店中创建,没有理由。它应该只是普通的自动变量,当它超出范围时会自动销毁。