代码之家  ›  专栏  ›  技术社区  ›  clarkk

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

c++
  •  -5
  • clarkk  · 技术社区  · 8 年前

    我有一些代码在这里表示(我是新到C++)

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

    * 从那以后 TessBaseAPI 是否仍有新实例?

    *api 意思是“价值”对吗?(不是参考文献)

    1 回复  |  直到 8 年前
        1
  •  1
  •   Nyque    8 年前

    是的,但在这种情况下并不意味着取消引用。我要把这行代码分解- 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 .两者之间的区别 马尔洛克 新的 是吗? 马尔洛克 只是分配内存 新的 分配内存 调用构造函数。 不要 通过调用释放内存 自由的 通过使用 新的 反之亦然。如果你使用 新的 ,仅使用 删除 如果你使用 马尔洛克 ,仅使用 自由的 .

    如果您认为手动分配/释放内存是麻烦的,C++ 11引入了一些叫做 智能指针 ,它自动为您分配和解除分配内存。例如,代替线条 tesseract::tessbaseapi*api=new tesseract::tessbaseapi()) ,你可以

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

    当你不再需要它的时候,就让它保持原样,当它退出时,它就会被释放。 范围 .因为没有明确的 新的 删除 所以你不必担心内存泄漏。当然,与使用原始指针相比,还有一些额外的开销,所以这是一种权衡。