【问题标题】:cannot delete std::vector & std::array?无法删除 std::vector & std::array?
【发布时间】:2013-09-27 05:21:40
【问题描述】:

我的 C++ 类有一个析构函数,它试图删除 std::vector 和 std::array 实例变量。

#include <iostream>
#include <vector>
#include <array>

int main()
{
    std::array<int, 3> foo;
    std::vector< std::array<float, 4> > vertices;

    foo[0] = 1;
    foo[1] = 2;
    foo[2] = 3;
    std::cout << foo[0] << std::endl;
    delete foo;
    delete vertices;

    return 0;
}

我不确定如何正确释放内存 - 为什么我不能删除这些变量?

clang++ -std=c++11 -stdlib=libc++ -Weverything ccc.cpp 
ccc.cpp:14:2: error: cannot delete expression of type 'std::array<int, 3>'
        delete foo;
        ^      ~~~
ccc.cpp:15:2: error: cannot delete expression of type 'std::vector<std::array<float, 4>
      >'
        delete vertices;
        ^      ~~~~~~~~
ccc.cpp:18:2: warning: C++98 requires newline at end of file [-Wc++98-compat-pedantic]
}
 ^

【问题讨论】:

  • 你没有用new分配任何东西,为什么你会有用delete释放东西的冲动?这些是自动变量 - 当它们超出范围时会自动销毁。
  • 即使它们是类中的成员实例变量?
  • 是的,一个类的成员没有附加隐藏的new
  • 它们不是您显示的代码中的类成员。无论如何,非静态类成员的生命周期与包含类实例的生命周期相匹配。
  • @ejang:首先,坦率地说,“在课堂上”发生的事情与您无关。如果类设计得当,类本身会处理一切。其次,std::array 不会在“类中”动态分配任何内存。 std::vector 确实如此,但同样,您不必担心。

标签: c++ arrays vector stl


【解决方案1】:

删除这些变量?您应该delete 的唯一“变量”是您由new 分配的变量。你有没有在这段代码中通过new 分配任何东西?不,所以,不要再尝试delete 任何东西了。

对象foovertices 是具有自动 存储持续时间的本地对象。这些对象的内存是自动分配和自动释放的。你不能自己做。这完全不在您的控制范围内。

如果您想手动控制内存分配,您必须使用new 动态创建这些对象。例如

std::array<int, 3> *foo = new std::array<int, 3>();
...
(*foo)[0] = 1;
(*foo)[1] = 2;
(*foo)[2] = 3;
...
delete foo;

上述方法将起作用。但是没有真正的理由在您的示例中涉及动态内存。对于自动对象,它可以正常工作。别再尝试delete他们了。

delete 需要一个 指针 作为参数。当您将通过new 分配对象时,您将通过指针访问这些对象。这些指针是您稍后将传递给delete 以销毁此类对象的指针。在这段代码中,这些都不适用。

【讨论】:

  • 如果 std::array 的内容是一个对象指针怎么办。像“std::array myArray1;”.. 如果是“Object *myArray2[10];”,那么我可以调用“delete []myArray2;”,它也会调用Object 实例的析构函数。我可以调用“删除 []myArray1;”吗? ?
  • @phoad:我不确定我是否理解您的评论。如果myArray2 被声明为Object *myArray2[10],那么您将能够做到delete[] myArray2
  • 我记得是“delete[] arr;”将调用“arr”中每个对象的析构函数并释放它们。 cplusplus.com/reference/new/operator%20delete[] "operator delete[] 是一个常规函数,可以像任何其他函数一样显式调用。但在 C++ 中,delete[] 是一个具有非常特殊行为的运算符:一个带有 delete[] 运算符的表达式,首先调用数组中每个元素的适当析构函数(如果这些是类类型),然后调用数组释放函数。”。应该是 Object arr[] = new Object[10],而不是 Object* arr[] ?
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2016-02-12
  • 2018-05-25
  • 2021-05-26
  • 1970-01-01
相关资源
最近更新 更多