当你将堆分配的char推入c ++中的向量时

时间:2011-07-02 19:16:35

标签: c++ vector cstring

我在将char *插入向量<字符*>

当我执行以下操作时:

string str = "Hello b World d"
char *cstr, *p;
vector<char*> redn;
cstr = new char [ (str.size)+1 ];
strcpy(cstr, str.c_str());

//here I tokenize "Hello b World d"
p = strtok(cstr," ");  
while(p!=NULL){
    redn.push_back(p);
    cout << "just pushed back: " << redn.back() << endl;
    p = strtok(NULL," ");
}
delete[] cstr;

//now check

for(it= redn.begin(); it < redn.end(); it++)
     cout << *it << endl;

我得到了一个输出:

just pushed back: Hello
just pushed back: b
just pushed back: World
just pushed back: d
p0s

World
d

在我看来,它指的是错误的东西...... 有人会告诉我发生了什么以及如何解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

为什么不使用vector<std::string>?它看起来像这样:

#include <string>
#include <sstream>
#include <iterator>
#include <vector>
#include <iostream>

int main() {
    std::string s = "Hello b World d";
    std::stringstream stream(s);
    std::vector<std::string> tokens(
        (std::istream_iterator<std::string>(stream)),
        (std::istream_iterator<std::string>()));
    for(std::vector<std::string>::iterator it = tokens.begin();
        it != tokens.end(); ++it)
        std::cout << *it << std::endl;
}

答案 1 :(得分:3)

您的代码有什么问题?

其他答案解释了如何以更好的方式做到这一点。我的回答解释了为什么你的代码没有像你期望的那样工作,并且快速修复它以使其正常工作。

声明:

delete[] cstr;

将对象推入向量后删除字符串,这会导致向量元素指向已经解除分配的内容。

注释掉该行并再次检查,它会起作用。

以下是Ideone上代码的working sample

在这种情况下,您的向量需要获取删除每个包含的对象指针的所有权,该指针指向动态分配的内存空间。

有关如何执行此操作,请参阅 this

答案 2 :(得分:0)

对于STL迭代器,使用以下语法:

vector<char*>::iterator it;
for(it= redn.begin(); 
    it != redn.end(); 
    ++it)
{
   cout << *it << endl;
}

(注意++它可以提高算法性能)