当每个字符串由"new char[]"创建时,如何对"vector<string>"的元素调用"delete"?
How can I call "delete" on the elements of a "vector<string>" when each string is created by a "new char[]"?
我有一个字符串的vector
,但是这些字符串是通过分配给它们一个字符数组来创建的。这个数组是用new
在堆中动态创建的。我知道这是一个很好的做法,释放你在堆中分配的内存,但是我不确定我应该如何释放这个vector
的内存。
当我尝试这样做时:
for(i = 0; i < myVector.size(); i++)
delete myVector[i];
它给了我这个错误:
下面是我如何声明vector表达式必须具有指针类型
vector<string> myVector;
char* s1 = new char[2];
s1[0] = 'a';
s1[1] = ' ';
myVector.push_back(s1);
char* s2 = new char[2];
s2[0] = 'b';
s2[1] = ' ';
myVector.push_back(s2);
//etc..
在这种情况下我该怎么做?
由于您使用vector<string>
并且因为std::string
对象管理它们自己的内存,您不需要delete
向量的元素:字符串已经复制了创建时传递给它们的内容。
但是,您需要删除使用new[]
分配的C字符串。您应该在创建string
对象之后立即执行此操作:一旦创建了字符串,字符数据就可以安全地删除:
char s1 = new char[2];
s1[0] = 'a';
s1[1] = ' ';
myVector.push_back(s1);
delete[] s1; // Here
注意,您选择了一种相当迂回的方式来创建字符串:您可以通过调用
来完成相同的事情。myVector.push_back("a");
另一种可能是使用std::string
,即std::vector<std::string>
。
在这种情况下,你不能再删除初始内存,除非你保留指针(这是毫无意义的,因为std::string
无论如何都会保留自己的字符串副本)。
考虑到你发布的代码,你应该记住,std::string
将创建你传递给构造函数的字符串的自己的副本,即使构造函数由于使用隐式类型转换而不可见。
释放(delete
)在你把字符串放入vector之后的内存。字符串不受此影响
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- std::vector的包装器,使数组的结构看起来像结构的数组
- 呼叫运营商<<临时
- 为什么(-1)%vector::size()总是返回0
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在C++中将类(带有Vector成员)保存为二进制文件
- 编译器如何区分std::vector的构造函数
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++重载<<具有typedef'd std::vector
- std::映射<>或std::vector<>在处理大型标志集时