我的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
。
对象foo
和vertices
是具有自动存储持续时间的本地对象。这些对象的内存将自动分配并自动释放。你不能自己做。这完全超出了您的控制范围。
如果要手动控制内存分配,则必须使用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
破坏这些对象的对象。在此代码中,这都不适用。