c++ - 无法删除 std::vector & std::array?

标签 c++ arrays vector stl

我的 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 分配的那些。您是否在这段代码中通过 new 分配了任何东西?不。所以,停止尝试删除任何东西。

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

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

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

以上将起作用。但是没有真正的理由在您的示例中涉及动态内存。它与自动对象一起工作得很好。停止尝试删除它们。

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

关于c++ - 无法删除 std::vector & std::array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18940175/

相关文章:

c++ - Boost Spirit : Error C2664, 无法将 'const boost::phoenix::actor<Eval>' 转换为 'char'

c++ - 复制图像后在 imshow 中断言失败 (size.width>0 && size.height>0)

C++,没有 <vector> 的对象数组

ios - 使用 Swift 对两个数组进行排序

c++ - 如何在 mpi 中发送字符串 vector ?

r - 如何通过索引在初始化向量中存储不同大小的 for 循环输出

c++ - 如何有效地设计一种方法,其中每个条件都依赖于另一个条件?

c++ - C++,QT。 QShortcut的函数调用不存在

C++ 如何将数组的最后 4 个字符转换为整数?

C++:为什么boost::ptr_vector resize需要对象具有默认构造函数