【问题标题】:Deleting a pointer to a vector删除指向向量的指针
【发布时间】:2014-11-05 10:16:06
【问题描述】:

我在课堂上有一个const std::vector<double> *vecPtr。我想正确释放内存,那么我的destructor 应该是什么样子?

我试过 ~ClassA() { delete[] vecPtr; } ,但我得到一个错误

*** Error in `./test': free(): invalid pointer: 0x00007fff8c643a98 ***
Aborted (core dumped)

delete[] 是否仅在向量被指针填充时才有效?

编辑:

我像这样使用vecPtrvecPtr = &vec;

如果我只使用delete,我会得到*** Error in ./test': double free or corruption (fasttop): 0x00000000008fcb20 ***

【问题讨论】:

  • 指向向量的指针几乎总是错误的。尝试改用向量。
  • 为什么,我要避免复制
  • 你不能通过在班级成员前面粘贴*来避免复制。
  • 事实上,任何用作类成员的指针几乎总是错误的。一个例外是当您收到第三方代码的指针时。在大多数其他情况下,您应该使用 shared_ptr 或 unique_ptr 或不使用 *

标签: c++ pointers vector delete-operator


【解决方案1】:

这取决于您如何创建vecPtr。如果你使用vecPtr = new std::vector<double>,你应该使用delete vecPtr;

如果vecPtr是由array new创建的,如vecPtr = new std::vector<double>[3];,则应使用array deletedelete[] vecPtr;

编辑

如果你使用vecPtr = &vec;,如果vec是自动变量,使用自动内存,或者vec是静态变量或全局变量,使用静态内存,你不应该删除它,它会被自动释放。只能删除动态内存。

【讨论】:

    【解决方案2】:

    删除 []。用于删除数组。

    delete vecPtr;
    

    您可能不应该使用指向向量的指针,因为没有太多理由这样做。

    【讨论】:

    • 为什么不...?动态内存上的向量通常更有意义,因此您不会影响有限的堆栈。
    【解决方案3】:
    const std::vector<double> *vecPtr
    

    vecPtr 是指向“向量”的指针,即单个对象。不要将其视为一个数组并使用数组删除调用(无论如何,它都用于向后兼容的 C 数组),而应将其视为它的本质 - 一个指向对象的指针。

    例如,如果您编写了自己的向量类,我们将其称为 vecarray,那么您将:

    const vecarray *vecPtr.
    

    您显然会使用delete vecPtr 删除它。向量和其他 stl 容器类也不例外。

    【讨论】:

      【解决方案4】:

      好吧,您的编辑并没有真正澄清,实际上引入了更多问题。 vec 实际上是一个自动变量,因此不应该被删除吗?我们不知道。

      不过,要回答您相当模糊的问题,如果您在免费存储中分配一个向量,则应仅使用 delete ptr 将其删除。如果您的ptr 实际上指向一个数组,那么您应该使用带有delete [] ptr 的数组删除。至少显然不是这样。如果您只是将向量的地址分配给ptr,那么您可能永远不应该删除它。像这样混淆所有权会导致一系列问题。

      【讨论】:

        猜你喜欢
        • 2013-04-14
        • 2013-09-24
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        • 2020-03-27
        • 2020-06-24
        相关资源
        最近更新 更多