【问题标题】:Why does segmentation fault occur when pushing to pointer of vector为什么推送到向量的指针时会发生分段错误
【发布时间】:2021-12-13 00:24:24
【问题描述】:

我正在尝试学习 c++,并想编写一个简单的程序来探索向量和指针的使用。当我尝试运行一个使用此函数的简单程序时,会发生分段错误。当我改变时

std::vector<string> *data;

std::vector<string> data;

并将 '->push_back()' 更改为 '.push_back()' 它运行良好。

int simple_tokenizer(string s)
{
    std::stringstream ss(s);
    std::vector<string> *data;
    string word;
    //char delimiter = ',';
    while(getline(ss,word, ',')) {
        //cout << "charsplit" << word << endl;
        data->push_back(word);
    }
    return 0;//data;

}

【问题讨论】:

  • 在使用 '*data' 之前,您应该分配/创建一个向量。
  • 感谢您的帮助!该实际向量应该替换 std::vector 吗?
  • 每次使用指针( * )时都需要分配/创建(即new &lt;type&gt;)。
  • 我不确定你想做什么。我相信你会喜欢std::vector&lt;string&gt; data;

标签: c++ pointers vector segmentation-fault


【解决方案1】:

您的代码正在生成分段错误,因为您没有为指针分配内存。

int simple_tokenizer(string s)
{
    std::stringstream ss(s);
    std::vector<string> *data = new std::vector<string>();
    string word;
    //char delimiter = ',';
    while(getline(ss,word, ',')) {
        //cout << "charsplit" << word << endl;
        data->push_back(word);
    }
    return 0;//data;

}

请注意,一旦你用完它,你需要 delete 它,但实际上动态分配 std::vector 是没有意义的,它会在其中分配所有需要的东西,你不必冒险使用内存泄漏,因为您不必到处使用delete 来追逐它。

【讨论】:

  • 非常感谢。这正是我想要做的。我意识到这没有任何意义,我只是想探索指针是如何工作的。当您说删除时,这只是通过 delete std::vector data; ?
  • 不,只是delete data
猜你喜欢
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2021-04-06
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多