std::vector - 如何释放向量中 char* 元素的内存?

Posted

技术标签:

【中文标题】std::vector - 如何释放向量中 char* 元素的内存?【英文标题】:std::vector - how to free the memory of char* elements in a vector? 【发布时间】:2012-03-13 08:16:43 【问题描述】:

考虑以下 C++ 代码:

using namespace std;
vector<char*> aCharPointerRow;
aCharPointerRow.push_back("String_11");
aCharPointerRow.push_back("String_12");
aCharPointerRow.push_back("String_13");
for (int i=0; i<aCharPointerRow.size(); i++)  
   cout << aCharPointerRow[i] << ",";

aCharPointerRow.clear();

aCharPointerRow.clear(); 行之后,aCharPointerRow 中的字符指针元素应全部删除。

上述 C++ 代码中是否存在内存泄漏?我是否需要显式释放分配给 char* 字符串的内存?如果是,如何?

感谢您的任何建议。

【问题讨论】:

你处理你的分配,然后vector 将处理它自己的分配。 应该是vector&lt;const char*&gt;char* 指针允许修改,但 "String_11" 是字符串文字,因此 const 【参考方案1】:

上述 C++ 代码是否存在内存泄漏? 没有内存泄漏。

由于您从未使用过new,因此您无需致电delete。如果它是首先分配的,您只需要释放动态内存。

请注意,理想情况下,您应该使用std::string 的向量。

std::vector<std::string> str;
str.push_back("String_11");
str.push_back("String_12");
str.push_back("String_13");

您可以使用 std::string.c_str() 以防您需要获取底层字符指针 (char *),许多 C api 都希望将其作为参数。

【讨论】:

【参考方案2】:

您正在推入向量字符串文字("..." 中的字符串)。这些不是你分配的。它们由 C++ 编译器/运行时提供给您,它们的生命周期等于应用程序的生命周期,因此您不能/不得释放它们。

例如见Scope of (string) literals

请注意,我告诉您的所有内容都是基于您使用的是字符串文字这一事实。如果您需要分配字符串的内存,那么您将不得不使用一些自动释放器,例如std::unique_ptr(C++11)或boost::unique_ptrboost::shared_ptr(Boost)或更好地使用std::string类正如Als所建议的

【讨论】:

为什么不直接使用std::string呢? @Als or better use the std::string class as suggested by Als @Als 最后我想向 OP 展示自动指针的“丰富性”。如果他真的对 C++ 感兴趣,他会需要它们... 够了,我没注意到那句话,我的错。 @xanatos 感谢您的建议。我知道智能指针的存在。我刚接触 C++,想澄清 std::vector 的概念。【参考方案3】:

样本没有泄漏,因为您给出的指针不引用动态内存。

但这也是一个糟糕的编写代码:字符串文字是常量,但 C++ 允许将它们称为 char* 以保持 C 库的向后兼容性。如果您打算引用字符串文字,最好使用const char* 而不是char*(如果尝试修改它们,您会遇到编译器错误,而不是运行时异常)

这里的另一个坏事是,在更广泛的代码中,您迟早会失去对有效存储在向量中的 char* 的控制权:它们是否始终是字符串文字,或者它们也可以是一些其他方式分配动态 char[] ??谁负责他们的分配/解除分配?

std::vector 对此一无所知,如果您处于该位置,则无法对上述问题给出明确的答案(每个 const char* 引用的缓冲区可以存在于向量存在范围之外,也可以不存在),您最好使用std::vector&lt;std::string&gt;,并将字符串视为“值”(不是引用的对象),让字符串类来做脏活。

【讨论】:

【参考方案4】:

没有泄漏。只要您不复制这些字符串,就不需要显式删除或释放()它们。

【讨论】:

以上是关于std::vector - 如何释放向量中 char* 元素的内存?的主要内容,如果未能解决你的问题,请参考以下文章

使用 shrink_to_fit() 释放向量向量中的内存

释放分配给二维向量的内存

堆上的整数向量和释放内存

新向量的向量

从 C++ std::vector 中删除元素

在c ++中删除和释放向量内存的正确方法(防止不同的内存相关错误)