我有一些代码可以表示这一点(我是C ++的新手)
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
因为*
还是一个新实例,将TessBaseAPI
放在这里是否有意义?
*api
是指“值”,对吗? (不是参考)
答案 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
,要取消分配的方法是调用free
。 malloc
和new
之间的区别在于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 时将被释放。这是一种非常简洁的方法,因为没有显式的new
和delete
,因此您不必担心内存泄漏。当然,与使用原始指针相比,会有一些额外的开销,因此这是一个折衷。