当每个字符串由"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 lt string delete 调用 元素 gt new 字符串 char 创建      更新时间:2023-10-16

我有一个字符串的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之后的内存。字符串不受此影响