0
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() 函数使用。为什么要在免费商店中创建对象。是的,我们可以将对象引用传递给主函数,但我们甚至可以传递对象的副本(即使不是使用 new 运算符创建的)。那么 new 和 delete 运算符的确切用途是什么?

4

4 回答 4

6

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

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

于 2013-08-23T06:59:55.623 回答
3

In your example, there is none, and it isn't good practice to use dynamic allocation. Dynamic allocation is used when objects have identity (or cannot be copied for some other reason), and the lifetime of the object does not correspond to some pre-determined lifetime, like static or auto. Dynamic allocation may also be used in a few cases where copying is expensive, and the profiler shows that the copying is a bottleneck; in such cases, using dynamic allocation and copying a pointer may remove the bottleneck. (But this should never be done until profiling shows it necessary.)

于 2013-08-23T08:15:33.550 回答
1

好问题。通常,它不需要 - 明确的。当然,还有另一个答案是“在运行时分配内存”和类似的评论。但是您可以使用 等来实现相同的目标std::vector<>std::string他们会在正确的时刻为您在幕后完成所有的记忆工作。

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

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

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

于 2013-08-23T07:46:33.507 回答
0

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

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

当然可以有多个堆栈,事实上,在方便和有用的情况下,这也很常见。但它是通过使用堆栈容器变量来完成的,其类型为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() 函数使用。为什么要在免费商店中创建对象。 ”,好吧,在问题代码中,它不应该被创建在免费商店,没有理由。它应该只是简单的自动变量,当它超出范围时会自动销毁。

于 2013-08-23T07:48:54.600 回答