0 c++ memory-management vector push-back
我是新手,我有一个问题让我很烦恼.请帮帮我.
我试图将char数组值保存在向量中.向量的大小与数字push_back相同.但是,向量中的所有值都是I push_back的最后一个值.
这是代码:
vector<char*> qField;
int index = 0;
for (int i =1;i <=q_size-seedLength;i++)
{
index++;
for (int j=0;j<seedLength-1;j++)
{
seed[j] = seed[j+1];
}
seed[seedLength-1] = *q_ptr;
++q_ptr;
seed[seedLength] = '\0';
qField.push_back(seed);
cout << "Insert Seed"<<index<<"\t\t: " <<qField[i]<<"\n";
}
/*
for (int x=0; x<qField.size();x++)
{
cout << " Result Query"<<x<<": " << qField[x]<<"\n";
}
*/
int x = 0;
for(nuc_vector::iterator iter=qField.begin();iter!=qField.end();++iter)
{
cout << x <<"\n";
x++;
cout << "Query " << *iter<<"\n";
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,值似乎存储在push_back之后的向量中.但是,当我使用另一个循环输出向量qField中的所有值时,所有值都与推回的最后一个值相同.
以下是我的结果的一部分:
Insert Seed7313 : 00133310
Insert Seed7314 : 01333100
Insert Seed7315 : 13331001
Insert Seed7316 : 33310013
Insert Seed7317 : 33100130
Insert Seed7318 : 31001303
Insert Seed7319 : 10013033
0
Query 10013033
1
Query 10013033
2
Query 10013033
3
Query 10013033
4
Query 10013033
5
Query 10013033
6
Query 10013033
Run Code Online (Sandbox Code Playgroud)
这是为什么 ?有什么不对的吗.
Lig*_*ica 11
它没有.
A char*不是字符串,容器或类似的东西.这不是你认为的"价值".这是一个指针.它是一个指向其他东西的对象:在这种情况下,显然是chars 的缓冲区.
您的向量qField包含相同指针(seed)的副本,一遍又一遍.当然,当您取消引用每个副本时,结果将是相同的!即使你在此期间修改了指针指向的东西.
复制指针不会神奇地复制它指向的东西,然后更新指针的值,现在指向指针的新副本.
您需要一个语义上包含您尝试存储的数据的对象.您希望它具有值语义.
你想要存储std::strings.
std::vector<std::string> qField;
Run Code Online (Sandbox Code Playgroud)