无法删除 std::vector & std::array?
cannot delete std::vector & std::array?
我的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
以销毁此类对象的指针。在此代码中,这些都不适用。
相关文章:
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 标准::unordered_map 中的 std::array 的值初始化
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 检查输入 std::array 指针数据是否等于某个常量数组
- 如何读/写或遍历 std::array 中的特定元素范围?
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 如何在C++中传递一个大小未知的 std::array?
- 将 std::array 推回 std::vector N 次的优雅方式
- 如何在 c++11 中静态断言 std::array 类成员进行排序?
- unqualified sort() -- 为什么它在 std::vector 上使用而不是在 std::array 上
- 按值返回 std::array
- 如何将变量内容常量转换为 std::array 的大小?
- 将初始化器列表/聚合初始化转发到 std::array 成员
- 无法推断类中的类型,构造函数采用 std::array
- 为什么 char 可以在 std::array 中初始化为 nullptr,而不是单独初始化?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问