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<const char*>
。 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_ptr
或boost::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<std::string>
,并将字符串视为“值”(不是引用的对象),让字符串类来做脏活。
【讨论】:
【参考方案4】:没有泄漏。只要您不复制这些字符串,就不需要显式删除或释放()它们。
【讨论】:
以上是关于std::vector - 如何释放向量中 char* 元素的内存?的主要内容,如果未能解决你的问题,请参考以下文章