将 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 指针存储在向量中的主要内容,如果未能解决你的问题,请参考以下文章

将已知长度的 char 指针转换为 char 向量而不分配新内存

将指向自定义对象的指针向量存储到文件中

在指针向量c ++中存储新对象

将 vector<char> 传递给指针 char*

C++ 通过引用传递向量字符指针

在函数中使用向量指针时出错