将 char 指针存储在向量中
Posted
技术标签:
【中文标题】将 char 指针存储在向量中【英文标题】:storing char pointers inside a vector 【发布时间】:2019-10-04 18:03:44 【问题描述】:在极少数情况下,我的程序崩溃了,我不知道为什么。 我认为这可能与我如何在向量中存储字符指针有关。
vector<char*> vec;
// here i store text for later
void pushToVector(const char *text)
char *t = new char[strlen(text)+1];
strcpy(t, text);
vec.push_back(t);
// now i want to print the first element and then erase it
void print()
if (vec.size() < 1) return;
printf("print: %s", vec.front());
char *t = vec.front();
vec.erase(vec.begin(), vec.begin()+1);
delete[] t;
这会一直有效吗?还是我做错了什么?
【问题讨论】:
如果您使用std::vector
,为什么不使用std::string
?它使这变得简单得多。
是否需要手动新建/删除并存储到vector和char*?为什么不是 C++?那么向量呢?如果你真的想要 char* 为什么不使用智能指针?
是的,我可能会切换到 std::string,但我仍然想知道上面的代码是否总是有效,还是会在极少数情况下崩溃?
您的代码并没有什么问题,但它或多或少是 C 风格的,并且可以通过稍后修改某些内容来破坏它。 C++ 是关于对象和所有权的。在代码中查看谁拥有哪个内存总是很好的。因此,您至少应该使用智能指针来存储您的内存。在您的用例中手动新建/删除是不行的!
【参考方案1】:
代码似乎没问题,尽管它是相当危险的代码。这些是我看到的不安全点:
你不检查参数text
是否真的是一个以null结尾的字符串
使用纯指针
没有明确的堆上字符串对象的所有权(我不希望 print
函数删除某些内容)
除非您被绑定到 C 风格的字符串,否则我强烈建议您使用 std::string
。
【讨论】:
同意,发布的代码本身不包含崩溃,但它确实促进了这种可能性,如果没有@987654321,可能无法完全回答 OP 的问题@(即查看函数的使用方式)。以上是关于将 char 指针存储在向量中的主要内容,如果未能解决你的问题,请参考以下文章