【发布时间】: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确实如此,但同样,您不必担心。