考虑以下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 *字符串的内存?如果是,怎么样?
感谢您的任何建议。
答案 0 :(得分:7)
上述C ++代码中是否存在内存泄漏?
没有内存泄漏。
由于您从未使用new
,因此无需致电delete
。如果首先分配了dynamicmemory,你只需要释放它。
请注意,理想情况下,您应该使用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都希望作为参数。
答案 1 :(得分:2)
样本没有泄漏,因为你给出的指针不是指动态内存。
但也是一个糟糕的编写代码:字符串文字是常量,但C ++允许将它们作为char *引用以保持C库向后兼容性。如果您打算引用字符串文字,最好使用const char*
而不是char*
(如果尝试修改它们,则会出现编译器错误,而不是运行时异常)
另一个坏处是,在更广泛的代码中,你迟早会失去对有效存储在向量中的char *的控制:它们是否被授予总是字符串文字或者它们也可能是某些字符串文字其他方式分配动态char [] ??谁负责他们的分配/解除分配?
std :: vector对此没有任何说明,如果您处于这个位置,则无法对上述问题给出一个干净的答案(每个const char*
引用的缓冲区可以存在于向量存在范围之外或者不存在) ,你最好使用std::vector<std::string>
,并将字符串视为“值”(不是引用的对象),让字符串类执行脏工作。
答案 2 :(得分:1)
没有泄漏。只要您没有复制这些字符串,就不需要明确删除或释放()它们。