c ++“new”关键字与java的比较

时间:2013-02-25 21:27:36

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

首先,我希望这不是一个共和国。我是一名java程序员,现在改为c ++。 在java中你可以这样做

 Object obj = new Object();

根据我的理解,你可以用c ++中的相同的东西(看看java中的obj如何只保存在变量中作为参考),如下所示:

Object* obj = new Object();

我的问题是:这个对象有多长时间了?只要指针有效,它会活着吗?还有,这可能会成为一个对象的成员初始化吗?如果指针被保存为可变成员(直到你存储它的对象是破坏者),那么对象是否会存在?

对于任何拼写错误。祝你有个美好的一天!

4 个答案:

答案 0 :(得分:6)

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

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

Object obj; // calls the default constructor

答案 1 :(得分:2)

此对象存活多长时间?

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

答案 2 :(得分:0)

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

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

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

如果你使用它,你应该添加一些错误处理,以防新的东西出错。

答案 3 :(得分:0)

C ++中没有保证的垃圾收集器,所以它会一直存在,直到它被明确删除。

如果您想使用指针并喜欢更多管理的内容,您可以使用smart pointer

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

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

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

TestMe()
{
  Object Obj();

  //Do something with object

}

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