【问题标题】:passing a vector pointer to a function causes segfault将向量指针传递给函数会导致段错误
【发布时间】:2011-06-13 19:58:22
【问题描述】:

我将一个向量指针传递给另一个使用该指针推送数据的函数:

void foo(vector<pair<int,int>> * vp){
 vp->push_back(pair<int,int>(1,1)); //causes segfault
}

void bar(vector<pair<int,int>> *vp = NULL){
  foo(vp);
}

push_back 导致段错误。

【问题讨论】:

  • 你怎么打电话给bar?你的调试器说了什么?
  • 通过引用传递向量。那么它永远不能为NULL。

标签: c++ pointers vector segmentation-fault


【解决方案1】:

如果您在没有参数的情况下调用bar,则vp 将是NULL。然后foo 被传递一个NULL 指针,因此这条指令vp-&gt;push_back 将产生分段错误。

【讨论】:

  • 如何在 bar() 中不指定 NULL 的情况下将向量指针设为默认值?因为我第一次将向量指针传递给 foo(),它将为空/NULL。
  • 您在使用它之前分配它,或者理想情况下,如果您真的不需要指针,您可以使用 Neil 建议的引用。
【解决方案2】:

如果很痛,不要这样做。你几乎不应该使用指针传递向量之类的东西——改用引用:

void foo(vector<pair<int,int>> & vp){
 vp.push_back(pair<int,int>(1,1));
}

【讨论】:

  • 同意,通过引用传递通常是更好的解决方案
  • 我不同意;使用非常量引用是一种不好的风格,因为您无法猜测您传递的参数是可变的代码。
【解决方案3】:

我猜你的向量是 NULL ...你会想要在 foo 中添加一个检查。

void foo(vector<pair<int,int>> * vp)
{
    if (vp != NULL)
        vp->push_back(pair<int,int>(1,1));
}

如果您的编译器支持 C++0x,也更喜欢使用 nullptr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多