【问题标题】:std::vector - how to free the memory of char* elements in a vector?std::vector - 如何释放向量中 char* 元素的内存?
【发布时间】: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

标签: c++ memory vector std


【解决方案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】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 2014-06-24
        • 2018-10-23
        • 2013-06-26
        • 1970-01-01
        相关资源
        最近更新 更多