[英]vector push_back add new items
我需要将项目添加到创建为std::vector<char*> Lista;
的向量中。
然后我做:
char txt[10];
for (int x = 0; x <= 5; x++)
{
sprintf(txt, "num%d", x);
printf("Add %s\n", txt);
Lista.push_back(txt);
}
但是如果我循环显示它显示的 Lista 项目:
for (int x = 0; x <= Lista.size() - 1; x++)
{
printf("Items > [%d] %s\n", x, Lista[x]);
}
项目 > [0] num5
项目 > [1] num5
项目 > [2] num5
项目 > [3] num5
项目 > [4] num5
项目 > [5] num5
我做错了什么? 我需要使用 char* 而不是字符串。
您将五个指向同一个数组的指针推入向量中,因此当您打印每个指针指向的数组内容时,它们都是相同的。
您只有一个数组: txt
。 每次通过循环时,您都会将新内容写入该数组并将指向它的指针推入Lista
。 所以第一次通过你的循环你有这个:
txt
┌─────┬─────┬─────┬─────┬──────┬─────┬─────┬─────┬─────┬─────┐
│ │ │ │ │ │ │ │ │ │ │
│ 'n' │ 'u' │ 'm' │ '0' │ '\0' │ ? │ ? │ ? │ ? │ ? │
│ │ │ │ │ │ │ │ │ │ │
└─────┴─────┴─────┴─────┴──────┴─────┴─────┴─────┴─────┴─────┘
▲
│
└───┐
│
┌───┼───┐
│ │ │
│ │ │
│ │
└───────┘
Lista
然后第二次通过你修改txt
并将另一个指向它的指针添加到Lista
,所以你有这个:
txt
┌─────┬─────┬─────┬─────┬──────┬─────┬─────┬─────┬─────┬─────┐
│ │ │ │ │ │ │ │ │ │ │
│ 'n' │ 'u' │ 'm' │ '1' │ '\0' │ ? │ ? │ ? │ ? │ ? │
│ │ │ │ │ │ │ │ │ │ │
└─────┴─────┴─────┴─────┴──────┴─────┴─────┴─────┴─────┴─────┘
▲ ▲
│ └─────────┐
└───┐ │
│ │
┌───┼───┬───┼───┐
│ │ │ │ │
│ │ │ │ │
│ │ │
└───────┴───────┘
Lista
等等。 Lista
的每个元素都包含一个指向同一数组的指针,您可以在循环的每次迭代中修改该数组。 当您返回并打印Lista
的每个元素指向的数组内容时,它们都指向同一个数组,因此每个元素都会打印相同的内容。
如果要在Lista
的每个元素中存储不同的文本,则需要为每个元素创建一个单独的字符串。 最简单的方法是将Lista
的类型更改为std::vector<std::string>
并让std::string
类处理为每个字符串分配空间:
for (int x = 0; x <= 5; ++x) {
std::string text = std::format(num{}, x); // Use std::ostringstream or sprintf if your compiler doesn't support std::format
Lista.push_back(text);
}
然后,您可以使用std::string
的data
成员函数来获取指向字符串底层char*
的指针,如果您需要将它传递给某些不支持std::string
的接口。 请记住,这些指针指向的数组的生命周期与std::string
对象的生命周期相关,因此请注意不要在std::string
(或包含它的std::vector
之后)使用它们) 超出范围。
如果您绝对不想使用std::string
来管理数组的生命周期,您可以使用new[]
自己分配它们,只需记住,您必须记住在使用完它们后delete[]
它们避免内存泄漏:
for (int x = 0; x <= 5; ++x) {
char* txt = new char[5];
sprintf(txt, "num%d", x);
Lista.push_back(txt);
}
// ... stuff
for (char* txt : Lista) {
delete[] txt;
}
不过,这样做的正当理由很少。 在 99.9% 的情况下,您应该使用std::string
或某种智能指针来管理您的内存。
注意:您的程序还表现出未定义的行为,因为您使用Lista[x+1] = txt
访问数组越界; 你应该摆脱那条线。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.