在免费商店中创建对象有什么用
What is the use of creating objects on the free store?
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);
的代码,您事先不知道需要什么对象,只是它应该如何行为。由于 Derived1
和Derived2
的大小通常无关,因此您只能在运行时知道需要多少内存。
重要原因是堆栈的工作原理。它只有推送和弹出操作。在你释放之后推送的所有内容之前,你不能在堆栈中发布某些东西。或者换句话说,如果某些东西从堆栈中释放出来,例如函数返回时函数调用的堆栈帧,那么堆栈中它上面的所有内存也会被释放(你最好确保它被正确破坏,见下文(。
程序通常需要独立于堆栈存储数据。有两种方法:在编译时分配内存(作为静态数据(,或在自由存储区(也称为堆(中分配内存。
当然可以有多个堆栈,事实上,当方便和有用时,通常也会这样做。但它是通过使用堆栈容器变量来完成的,类型为 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(( 函数使用。为什么应该在免费商店中创建对象">,好吧,在问题代码中,它不应该在免费商店中创建,没有理由。它应该只是普通的自动变量,当它超出范围时会自动销毁。
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何创建对象函数指针C++映射?
- C++创建对象数组
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何获取在 main() 函数中构造的类的创建对象?
- 基于文件中的条目创建对象
- 错误:创建对象后无法分配区域
- C++ 通过输入创建对象
- 堆还是堆栈用于创建对象?
- 使用 C++ 创建对象数组
- 使用unique_ptr创建对象
- 存储动态创建对象的列表/向量的最佳方法是什么
- 在 C/C++ 中创建对象时编译器优化的边界是什么
- 在免费商店中创建对象有什么用
- 我在创建对象并使用向量而不是数组使用它们的类函数时遇到问题......我做错了什么?
- 我想知道当函数在其中创建对象时会发生什么
- 什么时候在c++中创建对象?
- 使用new创建对象时会发生什么
- 什么时候删除对象?创建对象对c++的影响
- 创建引用和创建对象的主要区别是什么?