首页 文章

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

提问于
浏览
3

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

1 回答

  • 11

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

相关问题