启动新对象时取消引用新对象

时间:2018-06-23 10:12:09

标签: c++

我有一些代码可以表示这一点(我是C ++的新手)

tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();

因为*还是一个新实例,将TessBaseAPI放在这里是否有意义?

*api是指“值”,对吗? (不是参考)

1 个答案:

答案 0 :(得分:1)

是的,但是在这种情况下并不意味着取消引用。我将分解这行代码-tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI()

对于左手边,我学会阅读的方法是从标识符开始向右走,到终点时再向左走。因此,我们从api开始,然后向右走,但是什么也没有(假设我们只在左侧看),所以我们向左走。我们看到*,这意味着一个指针。接下来,我们看到tesseract::TessBaseAPI,它是指针的类型。因此,换句话说, api是指向tesseract :: TessBaseAPI 的指针。这种读取方式也有例外,例如,当有方括号或数组时,这是一般的想法。

对于右侧,new意味着在堆中分配内存(与编译器自动为您在堆栈中分配和释放内存相对),因此,new tesseract::TessBaseAPI()意味着您想要为tesseract::TessBaseAPI对象在堆中分配足够的内存。

通过组合左侧和右侧,我们得到 api是tesseract :: TessBaseAPI类型的指针,该指针当前指向已在堆中分配的内存位置。

如果您对*是指针还是取消引用感到困惑,则当它是变量声明或定义时是指针,否则将取消引用。这意味着在tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI()行之后,每当调用*api时,这都是取消引用。

编辑:

在堆上分配内存意味着您要对此负责,并且当您不再需要内存时,编译器将无法帮助您释放内存。释放内存的方法是调用delete。如果不这样做,则会出现内存泄漏

还有另一种分配内存的方法,即malloc,要取消分配的方法是调用freemallocnew之间的区别在于malloc仅分配内存,而new分配内存 并调用构造方法。 请勿通过调用您使用free分配的new来释放内存,反之亦然。如果使用new,则仅使用delete;如果使用malloc,则仅使用free

如果您认为手动分配/分配内存很麻烦,则C ++ 11引入了一个称为 smart指针的东西,它可以自动为您分配和分配内存。因此,例如,除了行tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(),您可以拥有

#include memory auto ptr = std::make_unique<tesseract::TessBaseAPI>(); //ptr acts like a normal pointer

当您不再需要它时,请将其保持原样,并且当它退出其 scope 时将被释放。这是一种非常简洁的方法,因为没有显式的newdelete,因此您不必担心内存泄漏。当然,与使用原始指针相比,会有一些额外的开销,因此这是一个折衷。