【问题标题】:c++ "new" keyword comparision to java [closed]c ++“new”关键字与java的比较[关闭]
【发布时间】:2013-02-25 21:27:35
【问题描述】:

首先我希望这不是重复的。我是一名java程序员,现在改用c++。 在java中你可以这样做

 Object obj = new Object();

据我了解,您可以在 c++ 中做同样的事情(查看 java 中的 obj 如何仅作为参考保存在变量中),如下所示:

Object* obj = new Object();

我的问题是:这个对象能活多久?它和指针一样长吗?另外,这可能会做一个对象的成员初始化吗?如果是这样,只要将指针保存为成员变量(直到您存储它的对象被销毁),该对象就会存在吗?

抱歉有任何错别字。有一个美好的一天/晚上!

【问题讨论】:

  • c++中没有garbage collection,需要自己释放内存
  • Srry for any typos. - 这个错字是故意的吗?
  • 尽管在某些地方有相似的语法,但 C++ 和 Java 在处理该主题(和相关问题)的方法上非常不同。两个数据模型的比较将变成对两者的完整描述。
  • @C.Lang 或者更好的是,使用智能指针。
  • 如果您只需要当前范围的对象,只需 duObject obj;。这对于一个简单的对象来说,速度要快几个数量级。对象在作用域结束时自动销毁,并自动调用其析构函数。

标签: java c++ object pointers member-initialization


【解决方案1】:

对象一直存在,直到有人在指向它的指针上调用delete。你不应该使用newdelete,除非你正在实现一些没有其他选择的库功能,并且你真的知道你在做什么。默认操作不应直接使用new,除非是初始化smart pointer 或插入某个为您处理内存管理的类。

这将是创建Object 的默认构造实例的 C++ 方式:

Object obj; // calls the default constructor

【讨论】:

  • 好的:(我会记住这一点。试图找到一种方法将向量初始化为成员变量。也许我应该对此提出一个新问题:P
  • @FredrikBostonWestman 你不需要做任何特别的事情。向量的默认构造函数做了一些明智的事情。
  • AFAIK 最常见的 C++ 垃圾收集器是 Boehm collector。至少从 C++03 开始​​就一直在使用它。 C++11 标准添加了一些对垃圾回收的最小支持,即 std::declare_reachablestd::undeclare_reachablestd::declare_no_pointersstd::undeclare_no_pointersstd::get_pointer_safety
【解决方案2】:

这个对象可以存活多久?

直到你明确地delete 它。与 Java 不同,C++ 中通过new 动态实例化的对象具有用户控制的生命周期,并且不会被垃圾回收,因此当对它们的所有引用消失时,它们不会自动释放。如果您想要这种行为,可以使用像 std::auto_ptrstd::unique_ptr 这样的类来为您处理。

【讨论】:

  • 我要补充一点,auto_ptr 已被弃用,shared_ptr 几乎总是矫枉过正。新代码应使用unique_ptr
  • Java 对象也不被引用计数。
  • @EJP:我的意思是垃圾收集。我更新了我的答案。
【解决方案3】:

你像这样创建一个对象。

在 .h 文件中,您有以下 Object *foo;

在 .cpp 类中,您可以像 java 一样初始化该类。

foo = new Object();

然后您使用 delete 关键字将其删除 - 因此在这种情况下删除 foo。

我和你在一条类似的船上。我强烈建议您了解指针(* 的东西)——它真的很强大。

编辑:如上所述,您也可以只做 Object foo 在堆栈上创建对象,而不是在堆上。

【讨论】:

  • yh :P 我在 * 和 & 的沼泽中。我知道它们之间的区别,但是当我初始化对象时,将它们传递给函数等。什么时候使用什么东西太令人困惑了:P
  • 我还不太了解 &。婴儿步是最好的。我以前用java写了30-50行代码,按编译,希望最好!我发现自己每次按键都在计划、保存和编译!
  • 我建议你在 youtube 上观看新的波士顿 c++ 教程 :) 有点慢,但他解释了很多东西。虽然它有点基本的东西
【解决方案4】:

在 C 或 C++ 中,它会一直存在,直到被删除。您通常希望将任何资源分配/解除分配(可以包括对 new/delete 和 malloc/free 的调用)包装在 ctor dtor 对中。例如

class ObjectManager
{
public:
    ObjectManager()
        : mObjectPtr(0)
    {
        mObjectPtr = new Object();
    }

    ~ObjectManager()
    {
        delete mObject;
    }
private:
    Object* mObjectPtr;
};

如果你使用它,你应该添加一些错误处理,以防 new 出现问题。

【讨论】:

  • 不在 C 中,因为 C 没有 newdelete
  • 这就是大家都在谈论的RAII吗?虽然这很好,但我不确定这将如何解决我将其作为成员变量的问题:O
  • 析构函数是不够的。如果你打算走这条路,你还需要定义或禁用(至少)复制构造函数和赋值运算符。对于 C++11,您还应该定义一个移动构造函数和一个移动赋值运算符。
【解决方案5】:

C++ 中没有保证的垃圾收集器,因此它会一直存在,直到被显式删除。

如果您想使用指针并喜欢更易于管理的东西,您可以使用smart pointer

std::unique_ptr<Object> Obj = new Object();

根据链接的答案,有几种不同类型的智能指针,但基本上智能指针一旦超出范围就会自动销毁对象。

至于你问题的成员初始化部分,你可以做

TestMe()
{
  Object Obj();

  //Do something with object

}

然后 Obj 在堆栈上被创建并在超出范围时自动销毁。

【讨论】:

  • -1 “C++ 中没有垃圾收集器,所以...”不正确。但是,不能保证垃圾收集:您必须显式使用垃圾收集器,而语言对此的支持非常有限。在发布自己的答案之前阅读其他答案和 cmets 会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多