我应该使用c ++类,有没有“新”?

时间:2010-09-08 08:35:52

标签: c++

什么时候应该使用指针,何时不使用? 什么是更好的方式? 我必须删除程序结尾处指针的cat对象吗?

示例:

cat piki;
piki.miao();
cat *piki2 = new cat();
piki2->miao();

8 个答案:

答案 0 :(得分:8)

尽可能尝试避免使用new(即在堆上)创建对象,因为您必须自己进行内存管理(或者至少需要使用智能指针)。如果在堆栈上分配对象(即cat piki;),则当cat超出范围时,将自动释放为piki对象分配的内存。 piki2不会发生这种情况,您需要明确地delete piki2;释放内存。

答案 1 :(得分:1)

使用或不使用new创建ojbect取决于您使用对象的位置。 如果在函数或块中使用它,则可以在没有new的情况下创建类的对象,以便在对象超出范围时自动调用析构函数。

如果您希望在多个方法中使用对象,或者想要从函数返回对象,则需要使用new创建对象,并确保正确删除它。

答案 2 :(得分:1)

要回答“我必须删除程序结束时指针的cat对象吗?”,我在其他答案中没有看到:
当程序结束时,从技术上讲,你经常不需要(参见Tony的评论)删除你用new分配的对象,因为大多数os'es会在你之后清理。 (注意“最多”,MsDos(我不知道哪个版本)是一个没有发生的例子,所以你必须在运行这些程序时重新启动。)
但是,不删除已经新增的内容被认为是不好的做法,因为程序往往会增长,之前“可接受”的内容可能会突然导致内存泄漏,从而可能导致系统不稳定。

可能没有删除的例子(我不认为在这些情况下你不应该关心):

  • 使用单身人士时,避免在析构函数中出现依赖问题。
  • 在多线程系统中,一些持有任何资源的线程可能会在没有清理的情况下暂停。

当然,在简单的情况下,更喜欢在没有其他答案建议的情况下分配。

答案 3 :(得分:0)

当前范围关闭时,piki对象将被自动删除。

必须明确删除

piki2

delete piki2;

答案 4 :(得分:0)

这完全针对您的要求。 直接使用对象的一个​​原因是,如果您知道需要多少个对象。 但是,如果您不确定要创建多少个对象,则每次需要创建一个对象时都可以使用new运算符创建对象。

但是如果你使用像你已经完成的指针

cat *piki2 - new cat();

然后正如您所提到的,一旦使用完毕,您需要删除指针。

delete piki2;

答案 5 :(得分:0)

cat *piki2 = new cat();
piki2->miao();

这是几种失败形式。例如,如果miao抛出异常怎么办?您应该始终使用自释放指针来获取资源。使用operator new创建的对象创建速度很慢,访问和管理速度很慢,加上额外的内存开销,所以你应该尽可能使用第一个表单。

答案 6 :(得分:0)

尽可能使用智能指针。使用boost智能指针库。

http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/smart_ptr.htm

答案 7 :(得分:0)

正如开发者艺术所说,你可以写一本关于这个主题的书。特别是如果您按照要求制作启发式列表。

然而,一些规则将有很长的路要走。

要考虑的一个因素是堆栈分配的cat实例不会被多态处理。对于要以多态方式进行树形化的对象,它必须由指针或引用表示。

任何不再需要的对象都应该尽快释放,或者设置为自动删除(auto_ptr或某种引用计数smart_ptr)。请记住,内存不仅被释放,对象析构函数被调用 - 而且还有RIAA。

你还必须记住,如果一个对象要经常传递,并且有一个昂贵的复制构造函数,那么使用一个对象而不是一个指针会调用一个很大的成本。

最后,您需要问自己一个物体需要多长时间。如果它需要超出本地范围,那么它很可能需要成为一个指针。