C++ 我怎样才能叫“我的朋友”;删除“;论a";向量<;字符串>&引用;当每个字符串由一个;新字符[]”吗;?

C++ 我怎样才能叫“我的朋友”;删除“;论a";向量<;字符串>&引用;当每个字符串由一个;新字符[]”吗;?,c++,memory-management,vector,C++,Memory Management,Vector,我有一个向量,但是这些字符串是通过给它们分配一个字符数组来创建的。此数组是使用new在堆中动态创建的。我知道释放堆中分配的内存是一个很好的做法,但是我不确定如何释放这个向量的内存 当我尝试这样做时: for(i = 0; i < myVector.size(); i++) delete myVector[i]; for(i=0;i

我有一个
向量
,但是这些字符串是通过给它们分配一个字符数组来创建的。此数组是使用
new
在堆中动态创建的。我知道释放堆中分配的内存是一个很好的做法,但是我不确定如何释放这个
向量的内存

当我尝试这样做时:

for(i = 0; i < myVector.size(); i++)
     delete myVector[i];
for(i=0;i
它给了我这个错误:

表达式必须具有指针类型

下面是我如何声明向量的

vector<string> myVector;
char* s1 = new char[2];
s1[0] = 'a';
s1[1] = '\0';
myVector.push_back(s1);
char* s2 = new char[2];
s2[0] = 'b';
s2[1] = '\0';
myVector.push_back(s2);
//etc..
向量myVector;
char*s1=新字符[2];
s1[0]=“a”;
s1[1]='\0';
myVector.push_back(s1);
char*s2=新字符[2];
s2[0]=“b”;
s2[1]='\0';
myVector.push_back(s2);
//等等。。

在这种情况下,我该怎么办?

因为您使用了
向量
,而且
std::string
对象管理自己的内存,所以不需要
删除向量的元素:字符串复制了您在创建时传递给它们的内容

但是,您需要删除分配给
new[]
的C字符串。您应该在创建
字符串
对象后立即执行此操作:创建字符串后,可以安全地删除字符数据:

char s1 = new char[2];
s1[0] = 'a';
s1[1] = '\0';
myVector.push_back(s1);
delete[] s1;  // Here
请注意,您选择了一种相当迂回的方法来创建字符串:通过调用

myVector.push_back("a");

另一种可能是使用
std::string
,即
std::vector

在这种情况下,您不能再删除初始内存,除非保留指针(这是毫无意义的,因为
std::string
仍将保留自己的字符串副本)


考虑到您发布的代码,您应该记住,
std::string
将创建您在构造函数中传递的字符串的ist自己的副本,即使构造函数由于使用隐式类型转换而不可见


将字符串放入向量后,立即释放(
delete
)内存。字符串不会受此影响。

1。您不能在
string
上执行
delete
,因为它会删除自身。2.因为您提到了
newchar[]
string
,所以您可能在初始化/赋值时把事情搞砸了。