我认识Java,但对C++知之甚少.我正在尝试为https://developers.google.com/v8/get_started上代码的主要功能编写前3个语句的类.
首先,我对如何在C++中创建对象有疑问.请参阅以下代码.
HandleScope handle_scope;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
Run Code Online (Sandbox Code Playgroud)
我认为在C++中,当你声明一个类的变量时,就会在该点创建一个类的实例.您不需要在Java中使用new关键字.因此,第一个语句将创建一个HandleScope实例,该实例将存储在handle_scope中.现在我不明白第二个陈述是如何起作用的.根据我的知识,在=之前的部分将创建一个新的Persistent对象,可以通过变量context来引用它.然后Context :: New()将创建一个新对象并将其存储在上下文中?嗯,我知道我错了.但我根本不知道它会如何工作?
我正在尝试为上面写一个C++类.这是我的尝试.
class MyClass {
private:
HandleScope handle_scope;
Persistent<Context> context;
Context::Scope context_scope;
public:
MyClass();
};
MyClass::MyClass()
{
context = Context::New();
context_scope = new Context::Scope(context);
}
Run Code Online (Sandbox Code Playgroud)
我是否正确完成了初始化?
编辑:回复peachykeen(在评论中)我做了以下实验.
我写了一个Test类,如下所示.测试{public:Test(){cout <<"Test"<< endl; }};
在主要功能中我写了Test test; 它输出"Test",表示在不使用new关键字的情况下创建对象.
jal*_*alf 11
你是对的,在C++中,对象是在定义后立即创建的.您不需要使用new关键字.
但是,与Java不同,可以使用不同类型的持续时间创建对象.使用new在堆上创建一个具有动态存储持续时间的对象:变量一直存在,直到您明确delete它为止.(并new返回指向创建对象的指针,以便您可以跟踪它)
如果您只是定义一个对象(如第一行和第三行),那么它将使用自动存储持续时间创建:也就是说,该对象一直存在,直到它超出范围.
这意味着您可以在函数内部创建对象,并保证在您离开函数时它们将被销毁 - 无论您如何离开函数.无论您是返回还是抛出异常,都new可以保证所有具有自动存储持续时间(不使用时创建)的对象得到正确清理.
这意味着您应该new尽可能避免.如果必须使用new,通常应将结果指针包装到智能指针类中,该类是使用自动存储持续时间创建的对象,以便自动销毁它.然后智能指针将delete自动调用新分配的对象,再次确保您不会泄漏内存.
这种区别是一个非常强大的工具,优秀的C++程序员需要很好地理解它.它是避免内存泄漏的关键,或者更普遍的是,各种资源泄漏,并且在某些方面,它比Java的垃圾收集器更强大.
例如,假设我们希望打开一个文件,然后将一些数据写入其中.在C++中,我们可以这样做:
void foo() {
std::ofstream file("foo.txt");
doStuff(file); // call a function which does something with the file
}
Run Code Online (Sandbox Code Playgroud)
因为它file是在没有使用的情况下声明的new,因为它具有自动存储持续时间,我们保证它会在超出范围时调用它的析构函数,并且它将被正确清理 - 也就是说,流将被刷新,并且文件句柄将被关闭.
是否doStuff可能抛出异常并不重要.不管如何,我们离开foo,file将被适当地破坏,所以我们并不需要做手脚try/ finally就像你在Java中那样.该类本身是异常安全的,无需用户的任何额外努力.
尝试在Java中编写一个类似的代码片段,它保证即使doStuff抛出异常,文件也会立即关闭.它会更长,并且需要用户更多的关注.
| 归档时间: |
|
| 查看次数: |
4656 次 |
| 最近记录: |