无法删除 std::vector & std::array?

cannot delete std::vector & std::array?

本文关键字:std array 删除 vector      更新时间:2023-10-16

我的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]
}
 ^

删除这些变量?您应该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以销毁此类对象的指针。在此代码中,这些都不适用。